Node.js — Концепція функції зворотних викликів

299

Від автора: зворотний виклик є асинхронним еквівалентом функції. Функція зворотного виклику викликається по завершенні виконання завдання. В 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!!!!!

Ці два приклади ілюструють концепцію блокуючих і неблокирующих викликів.

У першому прикладі програма блокує виконання до тих пір, поки не прочитає файл, і тільки після цього вона завершується.

У другому прикладі програма не очікує завершення зчитування файлу, а починає виводити «Program Ended», в той же час програма без блокування продовжує читання файлу.

Таким чином, блокує програма виконується строго послідовно. З точки зору програмування таку логіку реалізувати простіше, але неблокирующие програми не виконуються послідовно. У разі, якщо програмі необхідно використовувати будь-які дані, які обробляються, вона повинна зберігатися в одному блоці, щоб зробити її послідовною.