У попередніх підручниках ви б бачили функції зворотного виклику, які використовуються для асинхронних подій. Але іноді функції зворотного виклику можуть стати кошмаром, коли вони починають вкладатись, а програма починає ставати довгою та складною.
У цьому підручнику ви дізнаєтесь-
- Що таке обіцянки?
- Звонки обіцянкам
- Робота з вкладеними обіцянками
- Створення власної обіцянки
Що таке обіцянки?
Перш ніж ми почнемо з обіцянок, давайте спочатку переглянемо, що таке функції "зворотного виклику" в 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, спочатку потрібно завантажити та встановити модуль 'promis'.
Потім ми модифікуємо наш код, як показано нижче, який оновлює ім’я співробітника в колекції „Співробітник”, використовуючи обіцянки.
Крок 1) Встановлення модулів NPM
Для використання Promises із програми Node JS потрібен модуль обіцянки. Щоб встановити модуль обіцянки, виконайте наведену нижче команду
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. Отже, що це робить, це те, що коли встановлено підключення до бази даних, нам потрібно виконати фрагмент коду, визначений після цього.
- Нарешті, ми визначаємо наш фрагмент коду, який виконує роботу з оновлення EmployeeName працівника з іменем "Martin" до "Mohan".
Примітка:-
Якщо ви зараз перевірите вміст вашої бази даних MongoDB, ви виявите, що якщо запис із именем EmployeeName "Martin" існує, він буде оновлений до "Mohan".
Щоб перевірити, чи правильно було вставлено дані в базу даних, потрібно виконати наступні команди в MongoDB
- Використовуйте EmployeeDB
- db.Efficiee.find ({Ім'я працівника: Мохан})
Перше твердження гарантує підключення до бази даних EmployeeDb. Другий вислів шукає запис, у якому є ім'я працівника "Мохан".
Робота з вкладеними обіцянками
Визначаючи обіцянки, слід зазначити, що метод «тоді» сам повертає обіцянку. Отже, в певному сенсі обіцянки можуть бути вкладеними або прикутими один до одного.
У наведеному нижче прикладі ми використовуємо ланцюжок для визначення 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"})})});
Пояснення коду: -
- Зараз ми визначаємо 2 речення "тоді", які виконуються один за одним. У першому реченні then ми передаємо параметр 'db', який містить наше з'єднання з базою даних. Потім ми використовуємо властивість collection з’єднання 'db', щоб вставити записи до колекції 'Employee'. Метод 'insertOne' використовується для вставки фактичного документа до колекції Employee.
- Потім ми використовуємо речення 2- го тоді, щоб також вставити інший запис у базу даних.
Якщо ви зараз перевірите вміст бази даних MongoDB, ви знайдете 2 записи, вставлені в базу даних MongoDB.
Створення власної обіцянки
Спеціальне обіцянку можна створити, використовуючи модуль вузла під назвою 'q'. Бібліотеку 'q' потрібно завантажити та встановити за допомогою диспетчера пакетів вузлів. Після використання бібліотеки 'q' можна викликати метод "denodeify", який призведе до того, що будь-яка функція стане функцією, яка повертає обіцянку.
У наведеному нижче прикладі ми створимо просту функцію під назвою "Додати", яка додасть 2 числа. Ми перетворимо цю функцію на функцію для повернення обіцянки.
Щойно це буде зроблено, ми використаємо обіцянку, повернуту функцією Додати, щоб відобразити повідомлення в console.log.
Давайте виконуватимемо наведені нижче дії для створення власної функції повернення обіцянки.
Крок 1) Встановлення модулів NPM
Щоб використовувати 'q' у програмі Node JS, потрібен модуль 'q'. Щоб встановити модуль 'q', виконайте наведену нижче команду
npm встановити q
Крок 2) Визначте наступний код, який буде використаний для створення власної обіцянки.
Пояснення коду: -
- Перший біт - це включити бібліотеку 'q' за допомогою ключового слова require. Використовуючи цю бібліотеку, ми зможемо визначити будь-яку функцію для повернення зворотного виклику.
- Ми створюємо функцію під назвою Add, яка додасть 2 числа, визначені у змінних a та b. Сума цих значень зберігатиметься у змінній c.
- Потім ми використовуємо бібліотеку q, щоб denodeify (метод, який використовується для перетворення будь-якої функції у функцію, яка повертає обіцянку) нашу функцію Add або в іншому випадку перетворити нашу функцію Add у функцію, яка повертає обіцянку.
- Тепер ми викликаємо нашу функцію "Додати" і маємо змогу отримати значення обіцянки повернення через попередній крок, який ми виконали, дедедефіфікуючи функцію Додати.
- Використовується ключове слово 'then', вказує, що якщо функція успішно виконується, відобразиться рядок "Функція додавання завершена" в console.log.
Після запуску вищезазначеного коду, результат "Функція додавання завершена" буде відображатися в console.log, як показано нижче.
Резюме
- Використання функцій зворотного виклику в Node.js має свої недоліки. Іноді під час розробки вкладене використання функцій зворотного виклику може зробити код незрозумілішим і складним в обслуговуванні.
- Більшість проблем із вкладеними функціями зворотного виклику можна пом'якшити за допомогою обіцянок та генераторів у node.js
- Обіцянка - це значення, яке повертається асинхронною функцією для позначення завершення обробки, виконаної асинхронною функцією.
- Обіцянки можуть бути вкладені один в одного, щоб зробити вигляд коду кращим і простішим у підтримці, коли асинхронну функцію потрібно викликати після іншої асинхронної функції