Вступление

NodeJS - это среда выполнения javascript, которая работает поверх движка Chrome V8.

NodeJS является однопоточным и асинхронным. В большинстве приложений ЦП большую часть времени находится в состоянии ожидания. Основная проблема, которую решает NodeJS, заключается в том, что при выполнении программы используется процессор. В языках синхронного программирования, таких как Java, когда задача передается в ЦП, программа ожидает, пока результат не будет вычислен и возвращен. Но в NodeJS, когда задача передается процессору, NodeJS не ждет результата. Он просто продолжает выполнять остальную часть программы.

Обзор

Ключевой особенностью, которая делает NodeJS эффективным, является его управляемая событиями неблокирующая модель ввода-вывода. Но для того, чтобы справиться с его асинхронным характером, NodeJS использует функцию обратного вызова. Также важно помнить, что обратные вызовы не уникальны для самого NodeJS. Обратные вызовы являются частью ванильного JavaScript. Здесь мы сосредоточимся на том, как обратные вызовы используются в NodeJS. Обратный вызов - это просто функция JavaScript, которая передается асинхронной задаче. По завершении задачи эта функция обратного вызова будет выполнена.

Как включает в себя цикл событий -

Цикл событий - это то, что позволяет Node.js выполнять неблокирующие операции ввода-вывода. В Node операции ввода-вывода передаются в цикл обработки событий во время выполнения. Цикл событий состоит из множества фаз. На этапе обратных вызовов ввода-вывода цикла событий обрабатывается большинство обратных вызовов. После завершения операции функция обратного вызова выполняется в основном потоке.

Пример -

Использование обратного вызова при чтении файла.

'use strict'
 const fs = require('fs');
 const fileName = 'test.txt';
 
 fs.readFile(fileName, function(err,data){
         if(err){
             console.error(err);
         }
         console.log(data.toString());
 
     }
 
 );
 
 console.log("End");

Вывод -

End
Hello

Предположим, что файл test.txt находится в том же каталоге, что и файл JavaScript (в противном случае вместо имени файла необходимо передать путь к файлу функции readFile вместе с именем файла). Файл test.txt просто содержит текст «Привет». Когда fs вызывает метод readFile, передаются два параметра. Путь к файлу (в данном случае имя файла) и функция обратного вызова соответственно.

В пути выполнения функция readFile передает свое выполнение в цикл событий, который выполняется в фоновом режиме. Затем выполняется код после чтения файла (последняя строка). (Не дожидаясь завершения чтения файла). После завершения чтения файла выполняется функция обратного вызова. Если при чтении файла произошла ошибка, err фиксирует ее и выводит в консоль. Если чтение файла завершено успешно, параметр данных фиксирует значение и печатает его.

Здесь мы рассмотрели, как функция обратного вызова используется внутри метода readFile. В Node для разных методов требуются обратные вызовы, которые состоят из разных параметров. Здесь названия параметров значения не имеют. В примере без использования err и данных мы можем использовать любое имя параметра. Имеет значение только порядок и количество параметров. В соответствии с порядком параметров каждому параметру присваиваются определенные значения. В этом случае первый параметр получает ошибку при чтении файла, а второй - содержимое прочитанного файла. Но важно отметить, что рекомендуется использовать обычные имена параметров.

Функции обратного вызова могут быть вложенными для обработки нескольких задач. Это называется «адом обратного вызова».

Ссылки - https://www.tutorialspoint.com/nodejs/nodejs_callbacks_concept.htm

Https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/