Урок за 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, модулът „обещание“ трябва първо да бъде изтеглен и инсталиран.

След това ще променим нашия код, както е показано по-долу, който актуализира Employeename в колекцията „Employee“ чрез използване на обещания.

Стъпка 1) Инсталиране на NPM модулите

За да използвате Promises от Node JS приложение, се изисква модул за обещания. За да инсталирате обещателния модул, изпълнете командата по-долу

обещание за инсталиране на 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. Вторият оператор търси запис, който съдържа името на служителя „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', който съдържа нашата връзка с база данни. След това използваме свойството на колекцията на връзката 'db', за да вмъкнем записи в колекцията 'Employee'. Методът „insertOne“ се използва за вмъкване на действителния документ в колекцията Employee.
  2. След това използваме 2nd тогава клауза също за вмъкване на друг запис в базата данни.

Ако сега проверите съдържанието на вашия 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. Сега извикваме нашата функция „Добавяне“ и сме в състояние да получим върната обещана стойност поради предишната стъпка, която изпълнихме за денодеифициране на функцията Добавяне.
  5. Ключовата дума 'then' се използва, за да уточни, че ако функцията е изпълнена успешно, ще се покаже низът “Addition function completed” в console.log.

Когато горният код се изпълни, изходът „Функцията за добавяне е завършена“ ще се покаже в console.log, както е показано по-долу.

Създаване на персонализирано обещание

Oбобщение

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