От автора: обратный вызов является асинхронным эквивалентом функции. Функция обратного вызова вызывается по завершении выполнения задачи. В Node js функции обратного вызова используются для различных целей. Все API-интерфейсы Node написаны таким образом, чтобы они поддерживали обратные вызовы.
Например, функция чтения файла может начать чтение файла и немедленно вернуть элемент управления в среду выполнения, чтобы можно было выполнить следующую команду. После завершения ввода-вывода данных вызывается функция обратного вызова и при этом в нее передается содержимое файла в качестве параметра. Таким образом удается избежать блокировки выполнения или ожидания ввода/вывода файлов. Это делает Node.js высоко масштабируемым, так как он может обрабатывать большое количество запросов, не дожидаясь, пока какая-либо функция вернет результаты.
Пример блокирующего выполнение кода
Создайте текстовый файл с именем input.txt со следующим содержимым:
1 2 |
Tutorials Point is giving self learning content to teach the world in simple and easy way!!!!! |
Создайте файл js с именем main.js со следующим кодом:
1 2 3 4 5 6 |
var fs = require("fs"); var data = fs.readFileSync('input.txt'); console.log(data.toString()); console.log("Program Ended"); |
Теперь запустите main.js:
1 |
$ node main.js |
В результате мы получим следующее.
1 2 3 |
Tutorials Point is giving self learning content to teach the world in simple and easy way!!!!! Program Ended |
Пример неблокирующего кода
Создайте текстовый файл с именем input.txt со следующим содержимым.
1 2 |
Tutorials Point is giving self learning content to teach the world in simple and easy way!!!!! |
Измените файл main.js следующим образом:
1 2 3 4 5 6 7 8 |
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:
1 |
$ node main.js |
В результате мы получим следующее.
1 2 3 |
Program Ended Tutorials Point is giving self learning content to teach the world in simple and easy way!!!!! |
Эти два примера иллюстрируют концепцию блокирующих и неблокирующих вызовов.
В первом примере программа блокирует выполнение до тех пор, пока не прочитает файл, и только после этого она завершается.
Во втором примере программа не ожидает завершения считывания файла, а начинает выводить «Program Ended», в то же время программа без блокировки продолжает чтение файла.
Таким образом, блокирующая программа выполняется строго последовательно. С точки зрения программирования такую логику реализовать проще, но неблокирующие программы не выполняются последовательно. В случае, если программе необходимо использовать любые обрабатываемые данные, она должна храниться в одном блоке, чтобы сделать ее последовательной.
Источник: //www.tutorialspoint.com/
Редакция: Команда webformyself.