Учебное пособие по Node.js Promise

Содержание:

Anonim

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

В этом руководстве вы узнаете:

  • Что такое обещания?
  • Обратные вызовы к обещаниям
  • Работа с вложенными обещаниями
  • Создание пользовательского обещания

Что такое обещания?

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

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

  1. В приведенном выше коде часть функции (err, db) известна как объявление анонимной функции или функции обратного вызова. Когда MongoClient создает соединение с базой данных MongoDB, он вернется к функции обратного вызова после завершения операции соединения. Таким образом, в некотором смысле операции подключения происходят в фоновом режиме, и когда это делается, вызывается наша функция обратного вызова. Помните, что это один из ключевых моментов Node.js, позволяющий выполнять множество операций одновременно и, таким образом, не блокировать выполнение операции каким-либо пользователем.

  2. Второй блок кода - это то, что выполняется при фактическом вызове функции обратного вызова. Функция обратного вызова просто обновляет одну запись в нашей базе данных MongoDB.

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

Базовый синтаксис обещания показан ниже;

var promise = doSomethingAync()promise.then(onFulfilled, onRejected)
  • «doSomethingAync» - это любая функция обратного вызова или асинхронная функция, которая выполняет какую-то обработку.
  • На этот раз при определении обратного вызова возвращается значение, называемое «обещанием».
  • Когда обещание возвращается, оно может иметь 2 выхода. Это определяется предложением then. Либо операция может быть успешной, что обозначается параметром onFulfilled. Или у него может быть ошибка, которая обозначается параметром onRejected.

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

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

Обратные вызовы к обещаниям

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

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

Шаг 1) Установка модулей NPM

Чтобы использовать обещания из приложения Node JS, требуется модуль обещания. Чтобы установить модуль обещания, выполните следующую команду

npm install обещание

Шаг 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"}});});

Пояснение к коду: -

  1. Первая часть - это включить модуль «обещание», который позволит нам использовать функциональность обещания в нашем коде.
  2. Теперь мы можем добавить функцию then к нашей функции MongoClient.connect. Таким образом, при установке соединения с базой данных нам необходимо выполнить фрагмент кода, определенный после этого.
  3. Наконец, мы определяем наш фрагмент кода, который выполняет работу по обновлению EmployeeName сотрудника с именем «Мартин» до «Мохан».

Примечание:-

Если вы теперь проверите содержимое своей базы данных MongoDB, вы обнаружите, что если существует запись с EmployeeName, равным «Martin», она будет обновлена ​​до «Mohan».

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

  1. Используйте EmployeeDB
  2. db.Employee.find ({EmployeeName: Mohan})

Первый оператор гарантирует, что вы подключены к базе данных EmployeeDb. Вторая инструкция ищет запись с именем сотрудника «Mohan».

Работа с вложенными обещаниями

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

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

( Примечание . Цепочка - это концепция, используемая для связывания выполнения методов друг с другом. Предположим, что если в вашем приложении есть 2 метода с именами «methodA» и «methodB». И логика такова, что «methodB» должен вызываться после «methodA», тогда вы бы связали выполнение таким образом, чтобы 'methodB' вызывался непосредственно после 'methodA'.)

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

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"})})});

Пояснение к коду: -

  1. Сейчас мы определяем 2 предложения then, которые выполняются одно за другим. В первом предложении then мы передаем параметр db, который содержит наше соединение с базой данных. Затем мы используем свойство collection соединения db для вставки записей в коллекцию Employee. Метод insertOne используется для вставки фактического документа в коллекцию Employee.
  2. Затем мы используем 2- е предложение then также для вставки другой записи в базу данных.

Если вы теперь проверите содержимое своей базы данных MongoDB, вы обнаружите, что две записи вставлены в базу данных MongoDB.

Создание пользовательского обещания

Пользовательское обещание может быть создано с помощью модуля узла под названием «q». Библиотеку q необходимо загрузить и установить с помощью диспетчера пакетов узлов. После использования библиотеки 'q' может быть вызван метод «nodedeify», который заставит любую функцию превратиться в функцию, возвращающую обещание.

В приведенном ниже примере мы создадим простую функцию под названием «Добавить», которая добавит 2 числа. Мы преобразуем эту функцию в функцию, возвращающую обещание.

Как только это будет сделано, мы будем использовать обещание, возвращаемое функцией Add, для отображения сообщения в console.log.

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

Шаг 1) Установка модулей NPM

Чтобы использовать q из приложения Node JS, требуется модуль q. Чтобы установить модуль q, выполните следующую команду

npm install q

Шаг 2) Определите следующий код, который будет использоваться для создания настраиваемого обещания.

Пояснение к коду: -

  1. Первый бит - включить библиотеку q с помощью ключевого слова require. Используя эту библиотеку, мы сможем определить любую функцию для возврата обратного вызова.
  2. Мы создаем функцию под названием Add, которая добавит 2 числа, определенные в переменных a и b. Сумма этих значений будет сохранена в переменной c.
  3. Затем мы используем библиотеку q для обозначения (метода, используемого для преобразования любой функции в функцию, которая возвращала бы обещание) нашей функции добавления или иного преобразования нашей функции добавления в функцию, которая возвращает обещание.
  4. Теперь мы вызываем нашу функцию «Добавить» и можем получить возвращаемое значение обещания из-за того, что мы сделали предыдущий шаг для обозначения функции «Добавить».
  5. Ключевое слово then используется, чтобы указать, что в случае успешного выполнения функции отобразить строку «Функция добавления завершена» в console.log.

Когда приведенный выше код запускается, вывод «Функция добавления завершена» будет отображаться в console.log, как показано ниже.

Резюме

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