Учебники

Node.js — концепция обратных вызовов

Обратный вызов является асинхронным эквивалентом для функции. Функция обратного вызова вызывается при завершении данной задачи. Узел интенсивно использует обратные вызовы. Все API-интерфейсы Node написаны таким образом, что они поддерживают обратные вызовы.

Например, функция для чтения файла может начать чтение файла и немедленно вернуть управление в среду выполнения, чтобы можно было выполнить следующую инструкцию. Как только файловый ввод / вывод будет завершен, он вызовет функцию обратного вызова при передаче функции обратного вызова, содержимое файла в качестве параметра. Таким образом, нет блокировки или ожидания файлового ввода-вывода. Это делает Node.js легко масштабируемым, так как он может обрабатывать большое количество запросов, не ожидая, пока какая-либо функция вернет результаты.

Пример кода блокировки

Создайте текстовый файл с именем input.txt со следующим содержанием —

Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Создайте js-файл с именем main.js со следующим кодом —

var fs = require("fs");
var data = fs.readFileSync('input.txt');

console.log(data.toString());
console.log("Program Ended");

Теперь запустите main.js, чтобы увидеть результат —

$ node main.js

Проверьте вывод.

Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!
Program Ended

Пример неблокирующего кода

Создайте текстовый файл с именем input.txt со следующим содержанием.

Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Обновите main.js, чтобы иметь следующий код —

var fs = require("fs");

fs.readFile('input.txt', function (err, data) {
   if (err) return console.error(err);
   console.log(data.toString());
});

console.log("Program Ended");

Теперь запустите main.js, чтобы увидеть результат —

$ node main.js

Проверьте вывод.

Program Ended
Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Эти два примера объясняют концепцию блокирующих и неблокирующих вызовов.

  • В первом примере показано, что программа блокируется до тех пор, пока не прочитает файл, и только затем она продолжит выполнение программы.

  • Второй пример показывает, что программа не ждет чтения файла и продолжает печатать «Программа завершена», и в то же время программа без блокировки продолжает чтение файла.

В первом примере показано, что программа блокируется до тех пор, пока не прочитает файл, и только затем она продолжит выполнение программы.

Второй пример показывает, что программа не ждет чтения файла и продолжает печатать «Программа завершена», и в то же время программа без блокировки продолжает чтение файла.

Таким образом, блокирующая программа выполняется очень последовательно. С точки зрения программирования проще реализовать логику, но неблокирующие программы не выполняются последовательно. В случае, если программе необходимо использовать какие-либо данные для обработки, они должны храниться в одном и том же блоке для последовательного выполнения.