В предишни уроци бихте виждали функции за обратно извикване, които се използват за асинхронни събития. Но понякога функциите за обратно извикване могат да се превърнат в кошмар, когато започнат да се влагат и програмата започва да става дълга и сложна.
В този урок ще научите -
- Какво представляват обещанията?
- Обратни обаждания към обещания
- Справяне с вложени обещания
- Създаване на персонализирано обещание
Какво представляват обещанията?
Преди да започнем с обещания, нека първо да прегледаме какво представляват функциите за „обратно извикване“ в 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, е необходим модул обещание. За да инсталирате модула за обещание, изпълнете командата по-долу
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"}});});
Обяснение на кода: -
- Първата част е да включим модула „обещание“, който ще ни позволи да използваме функцията за обещание в нашия код.
- Вече можем да добавим функцията 'тогава' към нашата функция MongoClient.connect. Това, което прави, е, че когато връзката е установена към базата данни, трябва да изпълним кодовия фрагмент, определен след това.
- И накрая, дефинираме нашия кодов фрагмент, който върши работата по актуализиране на EmployeeName на служителя с името "Martin" до "Mohan".
Забележка:-
Ако сега проверите съдържанието на вашата база данни MongoDB, ще откриете, че ако съществува запис с име на EmployeeName на „Martin“, той ще бъде актуализиран до „Mohan“.
За да проверите дали данните са правилно вмъкнати в базата данни, трябва да изпълните следните команди в MongoDB
- Използвайте EmployeeDB
- db.Efficiee.find ({EmployeeName: Mohan})
Първото изявление гарантира, че сте свързани с базата данни EmployeeDb. Второто изявление търси записа, който има името на служителя на "Мохан".
Справяне с вложени обещания
Когато дефинирате обещания, трябва да се отбележи, че самият метод "тогава" връща обещание. Така че в известен смисъл обещанията могат да бъдат вложени или свързани помежду си.
В примера по-долу използваме верига, за да дефинираме 2 функции за обратно извикване, като и двете вмъкват запис в базата данни MongoDB.
( Забележка : Chaining е концепция, използвана за свързване на изпълнението на методите един с друг. Да предположим, че вашето приложение има 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“, за да вмъкваме записи в колекцията „Служител“. Методът "insertOne" се използва за вмъкване на действителния документ в колекцията на служител.
- След това използваме клаузата 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 в функция, която връща обещание.
- Сега извикваме нашата функция „Добавяне“ и сме в състояние да получим стойност на обещание за връщане поради предишната стъпка, която извършихме, за да деномеризираме функцията Добавяне.
- Използва се ключовата дума 'then', посочете, че ако функцията се изпълни успешно, тогава ще се покаже низът "Функцията за добавяне завършена" в console.log.
Когато се изпълни горният код, изходът "Функцията за добавяне завърши" ще се покаже в console.log, както е показано по-долу.
Обобщение
- Използването на функции за обратно извикване в Node.js има своите недостатъци. Понякога по време на процеса на разработване, вложеното използване на функции за обратно извикване може да направи кода по-бърз и труден за поддръжка.
- Повечето от проблемите с вложени функции за обратно извикване могат да бъдат смекчени с помощта на обещания и генератори в node.js
- Promise е стойност, върната от асинхронна функция, за да покаже завършването на обработката, извършена от асинхронната функция.
- Обещанията могат да бъдат вложени една в друга, за да изглежда кодът по-добър и по-лесен за поддържане, когато асинхронна функция трябва да бъде извикана след друга асинхронна функция