Учебники

7) Node.js Обещание

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

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

Какие обещания?

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

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

Учебное пособие по обещанию Node.js

  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, сначала необходимо загрузить и установить модуль «обещание».

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

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

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

npm установить обещание

Шаг 2) Измените код, чтобы включить обещания

Учебное пособие по обещанию Node.js

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 сотрудника с именем «Martin» на «Mohan».

Запись:-

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

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

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

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

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

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

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

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

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

Учебное пособие по обещанию Node.js

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- е предложение затем для вставки еще одной записи в базу данных.

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

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

Пользовательское обещание может быть создано с помощью модуля узла с именем ‘q.’ Библиотека ‘q’ должна быть загружена и установлена ​​с помощью менеджера пакетов узла. После использования библиотеки ‘q’ можно вызвать метод denodeify, который приведет к тому, что любая функция станет функцией, возвращающей обещание.

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

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

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

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

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

npm установить q

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

Учебное пособие по обещанию Node.js

Объяснение кода: —

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

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

Учебное пособие по обещанию Node.js

Резюме

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