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!!!!!
Эти два примера объясняют концепцию блокирующих и неблокирующих вызовов.
Первый пример показывает, что программа блокируется до тех пор, пока не прочитает файл, и только после этого переходит к завершению программы.
Второй пример показывает, что программа не ожидает чтения файла и переходит к печати «Программа завершена», и в то же время программа без блокировки продолжает чтение файла.
Таким образом, программа блокировки выполняется очень последовательно. С точки зрения программирования легче реализовать логику, но неблокирующие программы не выполняются последовательно. В случае, если программе необходимо использовать какие-либо данные для обработки, они должны храниться в одном блоке для последовательного выполнения.