Как мы все знаем из предыдущих сообщений (см. Начиная с 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 и обработки в нем цикла событий.
Вы можете использовать все и все в своем коде в зависимости от сложности и требований кода. Я бы не стал предлагать, какой из них использовать, я бы позволил вам изучить и выбрать тот, который вам лучше всего подходит и соответствует вашим требованиям.