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

Что такое обратный звонок?

Обратный вызов - это асинхронный эквивалент функции. Функция обратного вызова вызывается по завершении данной задачи. Node активно использует обратные вызовы. Все 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!!!!!

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

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

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

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