Підручник Node.js Promise

У попередніх посібниках ви бачили функції зворотного виклику, які використовуються для асинхронних подій. Але іноді функції зворотного виклику можуть стати кошмаром, коли вони починають бути вкладеними, і програма починає ставати довгою та складною.

Що таке обіцянки?

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

У прикладі нижче показано фрагмент коду, який використовується для підключення до a 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, спершу потрібно завантажити та встановити модуль «promise».

Потім ми змінимо наш код, як показано нижче, який оновлює Employeename у колекції Employee за допомогою обіцянок.

Крок 1) Встановлення модулів NPM

Щоб використовувати Promises у програмі Node JS, потрібен модуль Promises. Щоб установити модуль promise, виконайте наведену нижче команду

обіцянка встановлення npm

Крок 2) Змініть код, щоб включити обіцянки

Зворотні виклики до Promises

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. Перша частина полягає в тому, щоб включити модуль «promise», який дозволить нам використовувати функціональні можливості обіцянок у нашому коді.
  2. Тепер ми можемо додати функцію then до нашої функції MongoClient.connect. Отже, що це означає, що коли встановлено з’єднання з базою даних, нам потрібно виконати фрагмент коду, визначений після цього.
  3. Нарешті, ми визначаємо наш фрагмент коду, який виконує роботу з оновлення EmployeeName працівника з імені «Мартін» на «Мохан».

Примітка: -

Якщо ви зараз перевірите вміст свого MongoDB бази даних, ви побачите, що якщо існує запис із EmployeeName «Мартін», його буде оновлено на «Мохан».

Щоб переконатися, що дані правильно вставлено в базу даних, вам потрібно виконати наступні команди MongoDB

  1. Використовуйте EmployeeDB
  2. db.Employee.find({EmployeeName :Mohan })

Перший оператор гарантує, що ви підключені до бази даних EmployeeDb. Другий оператор шукає запис із ім’ям працівника «Мохан».

Робота з вкладеними обіцянками

Визначаючи проміси, слід зазначити, що сам метод «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, який містить підключення до бази даних. Потім ми використовуємо властивість колекції з’єднання «db», щоб вставити записи в колекцію «Співробітник». Метод «insertOne» використовується для вставлення фактичного документа в колекцію Employee.
  2. Потім ми використовуємо 2nd речення then також для вставлення іншого запису в базу даних.

Якщо ви зараз перевірите вміст свого MongoDB бази даних, ви знайдете 2 записи, вставлені в MongoDB бази даних.

Створення власної обіцянки

Користувацьку обіцянку можна створити за допомогою модуля вузла під назвою «q». Бібліотеку 'q' потрібно завантажити та встановити за допомогою менеджера пакетів вузлів. Після використання бібліотеки «q» можна викликати метод «denodeify», який змусить будь-яку функцію стати функцією, яка повертає обіцянку.

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

Коли це буде зроблено, ми використаємо обіцянку, яку повертає функція Add, щоб відобразити повідомлення в console.log.

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

Крок 1) Встановлення модулів NPM

Щоб використовувати «q» у програмі Node JS, потрібен модуль «q». Щоб установити модуль 'q', виконайте наведену нижче команду

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

Крок 2) Визначте наступний код, який використовуватиметься для створення спеціальної обіцянки.

Створення спеціальної обіцянки

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

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

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

Створення спеціальної обіцянки

Підсумки

  • Використання функцій зворотного виклику в Node.js має свої недоліки. Іноді під час процесу розробки вкладене використання функцій зворотного виклику може зробити код бруднішим і складним для підтримки.
  • Більшість проблем із вкладеними функціями зворотного виклику можна пом’якшити за допомогою промісів і генераторів Node.js
  • Обіцянка — це значення, яке повертає асинхронна функція, щоб вказати завершення обробки, виконаної асинхронною функцією.
  • Обіцянки можна вкладати одне в одне, щоб код виглядав краще та його було легше підтримувати, коли асинхронну функцію потрібно викликати після іншої асинхронної функції