betacode

Концепция Callback в NodeJS

  1. Что такое Callback?
  2. Пример NodeJS Callback

1. Что такое Callback?

Чтобы объяснить что такое Callback, рассмотрим следующую ситуацию:
Вы приходите в магазин, чтобы купить любимую вешь, сотрудник магазина говорит вам на данный момент этой вещь закончилась, вы оставляете телефон и просите магазин позвонить вам сразу как появится продукт. После этого вы можете делать другие вещи и не думать об этом магазине, до тех пор пока вы не получите звонок из магазина с оповещением об появлении вашего любимого продука.
Сервер NodeJS может получать очень много запросов (request) от многих пользователей. Поэтому для повышения способности предоставления услуг, все API у NodeJS смоделированы для поддержки Callback. "callback" это функция (function), она будет вызвана когда NodeJs завершает определенную задачу (task).

2. Пример NodeJS Callback

В NodeJS все API смоделированы для поддержки Callback. Например вы пишете программу для чтения 2 файлов. Чтобы сделать это вы используете module fs, он предоставляет вам 2 функции для чтения файла это readFile и readFileSync. Мы изучим разницу между 2-мя этими функциями.
Blocking
readFileSync это функция чтения файла синхронизированно (synchronous), поэтому когда выполняется данная функция она блокирует (block) программу выполнения следующих строк кода.
blocking-example.js
var fs = require("fs");

// -----> Read file 1:
console.log("\n");
console.log("Read File 1");

var data1 = fs.readFileSync('C:\\test\\file1.txt');

console.log("- Data of file 1: ");
console.log(data1.toString());


// -----> Read file 2:
console.log("\n");
console.log("Read File 2");

var data2 = fs.readFileSync('C:\\test\\file2.txt');
console.log("- Data of file 2: ");
console.log(data2.toString());


console.log("\n");
console.log("Program Ended");
Открыть окно CMD и исполнить файл blocking-example.js.
node callback-examples/blocking-example.js
И это результат, который вы получаете:
Non Blocking
Вам нужно использовать функцию readFile чтобы получить лучшую производительность для программы. Данная функция читает файл "асинхронно" (asynchronous), она "не блокирует" (non block) программу выполнять следующие строки кода. Другими словами это программа, которая не ждет когда данная функция завершится. Но когда эта функция завершит свое задание, она вызовет функцию Callback.
// Read a file Asynchronous.
fs.readFile('C:\\test\\file1.txt', aCallbackFunction );
Смотреть полный пример:
non-blocking-example.js
var fs = require("fs");

// A Callback function!
function readFinishedFile1(err, data)  {
   if (err) console.log(err);
   console.log("- Data of file 1: ");
   console.log(data.toString());
}

// A Callback function!
function readFinishedFile2(err, data)  {
   if (err) console.log(err);
   console.log("- Data of file 2: ");
   console.log(data.toString());
}

// -----> Read file 1:
console.log("\n");
console.log("Read File 1");

fs.readFile('C:\\test\\file1.txt', readFinishedFile1);

// -----> Read file 2:
console.log("\n");
console.log("Read File 2");

fs.readFile('C:\\test\\file2.txt', readFinishedFile2);

console.log("\n");
console.log("Program Ended \n");
Открыть окно CMD и запустить файл non-blocking-example.js:
node callback-examples/non-blocking-example.js
И это результат, который вы получаете: