Учебное пособие по обещаниям Node.js
В предыдущих руководствах вы видели функции обратного вызова, которые используются для асинхронных событий. Но иногда функции обратного вызова могут стать кошмаром, когда они начинают становиться вложенными, а программа становится длинной и сложной.
Что такое обещания?
Прежде чем мы начнем с обещаний, давайте сначала вернемся к тому, что такое функции «обратного вызова» в Node.js. Мы часто видели эти функции обратного вызова в предыдущих главах, поэтому давайте быстро пройдемся по одной из них.
В примере ниже показан фрагмент кода, который используется для подключения к MongoDB базу данных и выполнить операцию обновления одной из записей в базе данных.
- В приведенном выше коде часть функции (err,db) известна как объявление анонимной функции или функции обратного вызова. Когда MongoClient создает соединение с MongoDB базы данных, он вернется к функции обратного вызова после завершения операции подключения. Таким образом, в каком-то смысле операции подключения происходят в фоновом режиме, и когда они выполняются, вызывается наша функция обратного вызова. Помните, что это один из ключевых моментов Node.js, позволяющий выполнять множество операций одновременно и, таким образом, не блокировать выполнение операции каким-либо пользователем.
- Второй блок кода — это то, что выполняется при фактическом вызове функции обратного вызова. Функция обратного вызова просто обновляет одну запись в нашем MongoDB база данных.
Так что же такое обещание? Ну, промис — это всего лишь усовершенствование функций обратного вызова в Node.js. В ходе жизненного цикла разработки может возникнуть ситуация, когда вам потребуется объединить несколько функций обратного вызова вместе. В определенный момент времени это может стать довольно запутанным и трудным для поддержания. Короче говоря, обещание — это усовершенствование обратных вызовов, направленное на решение этих проблем.
Основной синтаксис обещания показан ниже;
var promise = doSomethingAync() promise.then(onFulfilled, onRejected)
- «doSomethingAync» — это любой обратный вызов или асинхронная функция, выполняющая какую-либо обработку.
- На этот раз при определении обратного вызова возвращается значение, называемое «обещанием».
- Когда обещание возвращается, оно может иметь 2 выхода. Это определяется предложением then. Либо операция может быть успешной, что обозначается параметром onFulfilled. Или это может быть ошибка, которая обозначается параметром onRejected.
Примечание: Таким образом, ключевым аспектом обещания является возвращаемое значение. При работе с обычными обратными вызовами в Node.js нет понятия возвращаемого значения. Благодаря возвращаемому значению у нас есть больше контроля над тем, как можно определить функцию обратного вызова.
В следующей теме мы увидим пример промисов и то, какую пользу они получают от обратных вызовов.
Обратные вызовы к обещаниям
Теперь давайте посмотрим на пример того, как мы можем использовать «обещания» внутри приложения Node.js. Чтобы использовать обещания в приложении Node.js, сначала необходимо загрузить и установить модуль «обещание».
Затем мы изменим наш код, как показано ниже, который обновляет имя сотрудника в коллекции «Сотрудник» с помощью обещаний.
Шаг 1) Установка модулей NPM
Чтобы использовать Promises из приложения Node JS, необходим модуль Promise. Чтобы установить модуль обещания, выполните приведенную ниже команду
Обещание установки npm
Шаг 2) Измените код, включив в него обещания.
var Promise = require('promise'); var MongoClient = require('mongodb').MongoClient; var url = 'mongodb://localhost/EmployeeDB'; MongoClient.connect(url) .then(function(err, db) { db.collection('Employee').updateOne({ "EmployeeName": "Martin" }, { $set: { "EmployeeName": "Mohan" } }); });
Объяснение кода: -
- Первая часть — включить модуль «обещание», который позволит нам использовать функциональность обещания в нашем коде.
- Теперь мы можем добавить функцию then к нашей функции MongoClient.connect. Итак, когда соединение с базой данных установлено, нам нужно выполнить определенный после этого фрагмент кода.
- Наконец, мы определяем наш фрагмент кода, который выполняет работу по обновлению ИмяСотрудника сотрудника с именем «Мартин» на «Мохан».
Примечание: -
Если вы сейчас проверите содержимое вашего MongoDB В базе данных вы обнаружите, что если запись с именем сотрудника «Мартин» существует, она будет обновлена до «Мохан».
Чтобы проверить, что данные были правильно вставлены в базу данных, вам необходимо выполнить следующие команды MongoDB
- Используйте базу данных сотрудников
- db.Employee.find({Имя Сотрудника: Мохан })
Первый оператор гарантирует, что вы подключены к базе данныхСотрудникDb. Второй оператор ищет запись с именем сотрудника «Мохан».
Работа с вложенными обещаниями
При определении промисов необходимо отметить, что сам метод «then» возвращает промис. Таким образом, в некотором смысле промисы могут быть вложены или связаны друг с другом.
В приведенном ниже примере мы используем цепочку для определения двух функций обратного вызова, обе из которых вставляют запись в MongoDB база данных.
(Внимание: Цепочка — это концепция, используемая для связывания выполнения методов друг с другом. Предположим, что в вашем приложении есть два метода: «Метод А» и «Метод Б». И логика была такова, что «метод B» должен вызываться после «метода A», тогда вы должны связать выполнение таким образом, чтобы «метод B» вызывался сразу после «метода A».)
Главное, что следует отметить в этом примере, — это то, что код становится чище, читаемым и поддерживаемым благодаря использованию вложенных промисов.
var Promise = require('promise'); var MongoClient = require('mongodb').MongoClient; var url = 'mongodb://localhost/EmployeeDB'; MongoClient.connect(url) .then(function(db) { db.collection('Employee').insertOne({ Employeeid: 4, EmployeeName: "NewEmployee" }) .then(function(db1) { db1.collection('Employee').insertOne({ Employeeid: 5, EmployeeName: "NewEmployee1" }) }) });
Объяснение кода: -
- Сейчас мы определяем два предложения «then», которые выполняются одно за другим. В первом предложении then мы передаем параметр db, который содержит наше соединение с базой данных. Затем мы используем свойство коллекции соединения «db» для вставки записей в коллекцию «Сотрудник». Метод «insertOne» используется для вставки фактического документа в коллекцию «Сотрудник».
- Затем мы используем 2nd then также предлагает вставить еще одну запись в базу данных.
Если вы сейчас проверите содержимое вашего MongoDB базе данных, вы обнаружите, что в базу данных вставлены две записи. MongoDB база данных.
Создание специального обещания
Пользовательское обещание можно создать с помощью модуля узла под названием «q». Библиотеку «q» необходимо загрузить и установить с помощью менеджера пакетов узла. После использования библиотеки q можно вызвать метод «denodeify», который превратит любую функцию в функцию, возвращающую обещание.
В приведенном ниже примере мы создадим простую функцию под названием «Добавить», которая будет добавлять 2 числа. Мы преобразуем эту функцию в функцию, возвращающую обещание.
Как только это будет сделано, мы будем использовать обещание, возвращаемое функцией Add, для отображения сообщения в console.log.
Давайте выполним следующие шаги, чтобы создать нашу пользовательскую функцию для возврата обещания.
Шаг 1) Установка модулей NPM
Чтобы использовать «q» в приложении Node JS, требуется модуль «q». Чтобы установить модуль «q», выполните следующую команду:
npm установить q
Шаг 2) Определите следующий код, который будет использоваться для создания специального обещания.
Объяснение кода: -
- Первый шаг — подключить библиотеку q с помощью ключевого слова require. Используя эту библиотеку, мы сможем определить любую функцию для возврата обратного вызова.
- Мы создаем функцию Add, которая будет добавлять два числа, определенные в переменных a и b. Сумма этих значений будет храниться в переменной c.
- Затем мы используем библиотеку q для деноденификации (метод, используемый для преобразования любой функции в функцию, которая возвращает обещание) нашей функции Add или иным образом преобразуем нашу функцию Add в функцию, которая возвращает обещание.
- Теперь мы вызываем нашу функцию «Добавить» и можем получить возвращаемое значение обещания благодаря предыдущему шагу, который мы выполнили по денодеификации функции «Добавить».
- Ключевое слово «then» указывает, что в случае успешного выполнения функции в файле console.log отображается строка «Функция сложения завершена».
Когда приведенный выше код будет запущен, вывод «Функция сложения завершена» будет отображаться в console.log, как показано ниже.
Итого
- Использование функций обратного вызова в Node.js имеет свои недостатки. Иногда в процессе разработки вложенное использование функций обратного вызова может сделать код более запутанным и сложным в обслуживании.
- Большинство проблем с вложенными функциями обратного вызова можно решить с помощью промисов и генераторов в Node.js
- Обещание — это значение, возвращаемое асинхронной функцией, указывающее на завершение обработки, выполненной асинхронной функцией.
- Промисы могут быть вложены друг в друга, чтобы код выглядел лучше и его было проще поддерживать, когда асинхронную функцию необходимо вызвать после другой асинхронной функции.