Как мы все знаем из предыдущих сообщений (см. Начиная с MEAN и MVC в MEAN), Node - это асинхронный язык. Таким образом, все ваши операции, такие как чтение и запись файлов, чтение и запись базы данных и т. Д., Являются асинхронными. Если мы хотим выполнять их синхронно, мы можем использовать обратные вызовы, обещания или асинхронный пакет. Я объясню каждую на примере.

Например у нас есть следующая задача

  • Шаг 1. Подключитесь к базе данных
  • Шаг 2: получите данные пользователя
  • Шаг 3: отфильтруйте по возрасту

Теперь в приведенной выше задаче вы можете выполнить шаг 2 только после того, как будет выполнен шаг 1, и точно так же для шага 3 вам нужно, чтобы шаг 2 был выполнен правильно.

На любом другом языке простой

openDatabase ()
getData ()
filterData ()

будет работать правильно, но не в случае NodeJS. Для этого мы можем сделать это тремя способами.

ОТВЕТЫ

Когда функция просто принимает другую функцию в качестве аргумента, эта содержащаяся функция называется функцией обратного вызова. Самый простой пример - функция тайм-аута.

setTimeout (function () {
console.log («эй»)
}, 10)

setTimeout принимает на вход функцию и целое число. Функции обратного вызова также могут принимать аргументы.

Теперь для нашей задачи мы можем вызвать следующую функцию как часть функции обратного вызова, например, из самой функции.

В приведенном выше примере мы вызываем функцию openDatabase (), которая, в свою очередь, вызывает функцию обратного вызова, которая принимает соединение и вызывает функцию getData (), которая снова вызывает другая функция обратного вызова, которая вызывает функцию filterData ().

Функция обратного вызова не запускается, если она не вызывается содержащейся в ней функцией, она вызывается обратно. Следовательно, термин функция обратного вызова

Этот пример выглядит простым для понимания, но по мере увеличения зависимости и сложности мы попадаем в состояние, называемое ад обратного вызова, которое представляет собой иерархию множественных обратных вызовов. Вот тогда код становится непонятным.

ОБЕЩАНИЯ

Как следует из названия, это обещание. Что-то вроде,

Я обещаю сделать это, если это правда, иначе я этого не сделаю.

С помощью обещаний мы можем гарантировать, что выполнение блока кода будет синхронным и будет выполняться только в том случае, если условие истинно.

Обещания имеют 3 состояния

  • Ожидание: это состояние до выполнения обещания.
  • Выполнено: если обещание было верным
  • Отклонено: если обещание было ложным

С обещаниями вместо асинхронного вызова, принимающего обратный вызов, он вместо этого возвращает обещание. Затем вызывающий код может дождаться выполнения этого обещания перед выполнением следующего шага.

Обещание возвращается с двумя ключевыми словами

  • resolve (): в случае успешного выполнения асинхронного кода
  • reject (): в случае сбоя выполнения асинхронного кода

Это снова получает вызывающая функция двумя ключевыми словами.

  • then (): получить в случае успешного выполнения кода
  • catch (): для перехвата исключений в случае отклонения обещания.

Теперь наша примерная задача может быть выполнена таким образом

Это упрощает чтение кода. По сути, promises также внутренне использует обратные вызовы.

Обещания асинхронны. Обещания в функциях помещаются в очередь микрозадач и выполняются после завершения других синхронных операций.

ASYNC

Async - это пакет в Node. Это удобно, когда вам нужно выполнить некоторые операции параллельно, а некоторые - последовательно. Основным принципом async также является обратный вызов, но это делает код читабельным. Приведенный выше пример будет работать как

Это устраняет сложность запуска обещаний и делает код читаемым в случае множественных обратных вызовов, предотвращающих ад обратных вызовов.

Это также помогает в случае, когда вам нужно выполнить комбинацию синхронной и асинхронной задачи. Например, чтобы получить данные из 2-х таблиц в базе данных.

В этом случае мы должны запустить openDatabase (), а затем запустить функции getUserData и getEventData параллельно, например

ЗАКЛЮЧЕНИЕ

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

Вы можете использовать все и все в своем коде в зависимости от сложности и требований кода. Я бы не стал предлагать, какой из них использовать, я бы позволил вам изучить и выбрать тот, который вам лучше всего подходит и соответствует вашим требованиям.