Node.js Promise Tutorial
V pลedchozรญch kurzech jste vidฤli funkce zpฤtnรฉho volรกnรญ, kterรฉ se pouลพรญvajรญ pro asynchronnรญ udรกlosti. Nฤkdy se vลกak funkce zpฤtnรฉho volรกnรญ mohou stรกt noฤnรญ mลฏrou, kdyลพ se zaฤnou vnoลovat a program zaฤne bรฝt dlouhรฝ a sloลพitรฝ.
Co jsou sliby?
Neลพ zaฤneme se sliby, podรญvejme se nejprve, co jsou funkce โzpฤtnรฉho volรกnรญโ v Node.js. Tyto funkce zpฤtnรฉho volรกnรญ jsme jiลพ mnohokrรกt vidฤli v pลedchozรญch kapitolรกch, pojฤme si tedy rychle projรญt jednu z nich.
Nรญลพe uvedenรฝ pลรญklad ukazuje fragment kรณdu, kterรฝ se pouลพรญvรก k pลipojenรญ k a MongoDB databรกzi a proveฤte operaci aktualizace jednoho ze zรกznamลฏ v databรกzi.
- Ve vรฝลกe uvedenรฉm kรณdu je ฤรกst funkce (err,db) znรกmรก jako deklarace anonymnรญ nebo zpฤtnรฉ funkce. Kdyลพ MongoClient vytvoลรญ pลipojenรญ k MongoDB databรกze se po dokonฤenรญ operace pลipojenรญ vrรกtรญ k funkci zpฤtnรฉho volรกnรญ. Takลพe v jistรฉm smyslu operace pลipojenรญ probรญhajรญ na pozadรญ, a kdyลพ jsou hotovรฉ, zavolรก naลกi funkci zpฤtnรฉho volรกnรญ. Pamatujte, ลพe toto je jeden z klรญฤovรฝch bodลฏ Node.js, kterรฝ umoลพลuje soubฤลพnรฉ provรกdฤnรญ mnoha operacรญ a neblokuje tak ลพรกdnรฉho uลพivatele v provedenรญ operace.
- Druhรฝ blok kรณdu je to, co se provede pลi skuteฤnรฉm volรกnรญ funkce zpฤtnรฉho volรกnรญ. Funkce zpฤtnรฉho volรกnรญ pouze aktualizuje jeden zรกznam v naลกem MongoDB databรกze.
Co je tedy slib? No, slib je jen vylepลกenรญ funkcรญ zpฤtnรฉho volรกnรญ v Node.js. Bฤhem ลพivotnรญho cyklu vรฝvoje mลฏลพe nastat pลรญpad, kdy budete muset vnoลit vรญce funkcรญ zpฤtnรฉho volรกnรญ dohromady. To mลฏลพe bรฝt v urฤitรฉm okamลพiku ponฤkud chaotickรฉ a obtรญลพnรฉ udrลพovat. Struฤnฤ ลeฤeno, pลรญslib je vylepลกenรญm zpฤtnรฝch volรกnรญ, kterรฉ se zamฤลuje na zmรญrnฤnรญ tฤchto problรฉmลฏ.
Zรกkladnรญ syntaxe slibu je uvedena nรญลพe;
var promise = doSomethingAync() promise.then(onFulfilled, onRejected)
- โdoSomethingAyncโ je jakรกkoli zpฤtnรก volรกnรญ nebo asynchronnรญ funkce, kterรก provรกdรญ nฤjakรฝ druh zpracovรกnรญ.
- Tentokrรกt je pลi definovรกnรญ zpฤtnรฉho volรกnรญ vrรกcena hodnota, kterรก se nazรฝvรก โslibโ.
- Kdyลพ je pลรญslib vrรกcen, mลฏลพe mรญt 2 vรฝstupy. To je definovรกno klauzulรญ โpakโ. Operace mลฏลพe bรฝt รบspฤลกnรก, coลพ je oznaฤeno parametrem 'onFulfilled'. Nebo mลฏลพe mรญt chybu, kterรก je oznaฤena parametrem 'onRejected'.
Poznรกmka: Klรญฤovรฝm aspektem pลรญslibu je tedy nรกvratnost. Pลi prรกci s normรกlnรญmi zpฤtnรฝmi volรกnรญmi v Node.js neexistuje ลพรกdnรก koncepce nรกvratovรฉ hodnoty. Dรญky nรกvratovรฉ hodnotฤ mรกme vฤtลกรญ kontrolu nad tรญm, jak lze definovat funkci zpฤtnรฉho volรกnรญ.
V dalลกรญm tรฉmatu uvidรญme pลรญklad slibลฏ a jejich uลพitek ze zpฤtnรฝch volรกnรญ.
Zpฤtnรก volรกnรญ ke slibลฏm
Nynรญ se podรญvejme na pลรญklad toho, jak mลฏลพeme pouลพรญt โslibyโ z aplikace Node.js. Aby bylo moลพnรฉ pouลพรญvat sliby v aplikaci Node.js, je tลeba nejprve stรกhnout a nainstalovat modul โpromiseโ.
Potรฉ upravรญme nรกลก kรณd, jak je uvedeno nรญลพe, kterรฝ aktualizuje jmรฉno zamฤstnance v kolekci โZamฤstnanecโ pomocรญ slibลฏ.
Krok 1) Instalace modulลฏ NPM
Chcete-li pouลพรญvat Promises z aplikace Node JS, je vyลพadovรกn modul slibu. Chcete-li nainstalovat modul slib, spusลฅte nรญลพe uvedenรฝ pลรญkaz
slib instalace npm
Krok 2) Upravte kรณd tak, aby zahrnoval sliby
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"
}
});
});
Code Vysvฤtlenรญ:-
- Prvnรญ ฤรกstรญ je zahrnutรญ modulu 'promise', kterรฝ nรกm umoลพnรญ pouลพรญvat funkci slibu v naลกem kรณdu.
- Nynรญ mลฏลพeme k naลกรญ funkci MongoClient.connect pลipojit funkci 'pak'. Takลพe kdyลพ je navรกzรกno spojenรญ s databรกzรญ, musรญme provรฉst fragment kรณdu definovanรฝ potรฉ.
- Nakonec definujeme nรกลก รบryvek kรณdu, kterรฝ aktualizuje jmรฉno zamฤstnance zamฤstnance se jmรฉnem โMartinโ na โMohanโ.
Poznรกmka: -
Pokud nynรญ zkontrolujete obsah svรฉho MongoDB databรกze, zjistรญte, ลพe pokud existuje zรกznam se jmรฉnem zamฤstnance โMartinโ, bude aktualizovรกn na โMohanโ.
Chcete-li zkontrolovat, zda byla data sprรกvnฤ vloลพena do databรกze, musรญte provรฉst nรกsledujรญcรญ pลรญkazy MongoDB
- Pouลพijte EmployeeDB
- db.Employee.find({EmployeeName :Mohan })
Prvnรญ pลรญkaz zajiลกลฅuje, ลพe jste pลipojeni k databรกzi EmployeeDb. Druhรฝ pลรญkaz hledรก zรกznam, kterรฝ mรก jmรฉno zamฤstnance โMohanโ.
Vypoลรกdรกnรญ se s vnoลenรฝmi sliby
Pลi definovรกnรญ slibลฏ je tลeba poznamenat, ลพe samotnรก metoda โpakโ vracรญ slib. Takลพe v jistรฉm smyslu mohou bรฝt sliby vnoลenรฉ nebo ลetฤzenรฉ k sobฤ navzรกjem.
V nรญลพe uvedenรฉm pลรญkladu pouลพรญvรกme ลetฤzenรญ k definovรกnรญ 2 funkcรญ zpฤtnรฉho volรกnรญ, z nichลพ obฤ vklรกdajรญ zรกznam do MongoDB databรกze.
(Hodnocenรญ: ลetฤzenรญ je koncept pouลพรญvanรฝ ke vzรกjemnรฉmu propojenรญ provรกdฤnรญ metod. Pลedpoklรกdejme, ลพe vaลกe aplikace mฤla 2 metody nazvanรฉ โmethodAโ a โmethodBโ. A logika byla takovรก, ลพe 'methodB' by mฤla bรฝt volรกna po 'methodA', pak byste zลetฤzovali provรกdฤnรญ takovรฝm zpลฏsobem, ลพe 'methodB' se volรก pลรญmo za 'methodA').
Klรญฤovรก vฤc, kterou je tลeba v tomto pลรญkladu poznamenat, je, ลพe kรณd se stรกvรก ฤistลกรญm, ฤitelnรฝm a udrลพovatelnรฝm pomocรญ vnoลenรฝch pลรญslibลฏ.
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"
})
})
});
Code Vysvฤtlenรญ:-
- Nynรญ definujeme 2 klauzule โpakโ, kterรฉ se provรกdฤjรญ jedna po druhรฉ. V prvnรญ klauzuli potom pลedรกvรกme parametr 'db', kterรฝ obsahuje naลกe pลipojenรญ k databรกzi. Potom pouลพรญvรกme vlastnost kolekce pลipojenรญ 'db' k vklรกdรกnรญ zรกznamลฏ do kolekce 'Zamฤstnanec'. Metoda 'insertOne' se pouลพรญvรก k vloลพenรญ skuteฤnรฉho dokumentu do kolekce Employee.
- Pak pouลพรญvรกme 2nd pak klauzule takรฉ pro vloลพenรญ dalลกรญho zรกznamu do databรกze.
Pokud nynรญ zkontrolujete obsah svรฉho MongoDB databรกze, najdete 2 zรกznamy vloลพenรฉ do MongoDB databรกze.
Vytvoลenรญ vlastnรญho pลรญslibu
Vlastnรญ pลรญslib lze vytvoลit pomocรญ modulu uzlu s nรกzvem 'q.' Knihovnu 'q' je tลeba stรกhnout a nainstalovat pomocรญ sprรกvce balรญฤkลฏ uzlลฏ. Po pouลพitรญ knihovny 'q' lze zavolat metodu โdenodeifyโ, kterรก zpลฏsobรญ, ลพe se z jakรฉkoli funkce stane funkce, kterรก vracรญ slib.
V nรญลพe uvedenรฉm pลรญkladu vytvoลรญme jednoduchou funkci s nรกzvem โPลidatโ, kterรก seฤte 2 ฤรญsla. Tuto funkci pลevedeme na funkci, kterรก vrรกtรญ slib.
Jakmile to udฤlรกme, pouลพijeme pลรญslib vrรกcenรฝ funkcรญ Pลidat k zobrazenรญ zprรกvy v console.log.
Pojฤme se ลรญdit nรญลพe uvedenรฝmi kroky k vytvoลenรญ naลกรญ vlastnรญ funkce pro vrรกcenรญ slibu.
Krok 1) Instalace modulลฏ NPM
Chcete-li pouลพรญt 'q' z aplikace Node JS, je vyลพadovรกn modul 'q'. Chcete-li nainstalovat modul 'q', spusลฅte nรญลพe uvedenรฝ pลรญkaz
instalace npm q
Krok 2) Definujte nรกsledujรญcรญ kรณd, kterรฝ bude pouลพit k vytvoลenรญ vlastnรญho pลรญslibu.
Code Vysvฤtlenรญ:-
- Prvnรญ bit je zahrnout knihovnu 'q' pomocรญ klรญฤovรฉho slova require. Pomocรญ tรฉto knihovny budeme schopni definovat libovolnou funkci pro vrรกcenรญ zpฤtnรฉho volรกnรญ.
- Vytvรกลรญme funkci s nรกzvem Add, kterรก seฤte 2 ฤรญsla definovanรก v promฤnnรฝch a a b. Souฤet tฤchto hodnot bude uloลพen v promฤnnรฉ c.
- Potom pouลพรญvรกme knihovnu q k denodeifikaci (metoda pouลพรญvanรก k pลevodu jakรฉkoli funkce na funkci, kterรก by vrรกtila slib) naลกรญ funkce Add nebo k jinรฉmu pลevodu naลกรญ funkce Add na funkci, kterรก vracรญ slib.
- Nynรญ volรกme naลกi funkci โPลidatโ a jsme schopni zรญskat hodnotu nรกvratovรฉho pลรญslibu dรญky pลedchozรญmu kroku, kterรฝ jsme provedli pลi denodeifikaci funkce Pลidat.
- Pouลพรญvรก se klรญฤovรฉ slovo 'then', kterรฉ urฤuje, ลพe pokud je funkce รบspฤลกnฤ provedena, zobrazรญ se v konzole.log ลetฤzec โFunkce pลidรกnรญ dokonฤenaโ.
Po spuลกtฤnรญ vรฝลกe uvedenรฉho kรณdu se v konzole.log zobrazรญ vรฝstup โFunkce pลidรกnรญ dokonฤenaโ, jak je uvedeno nรญลพe.
Shrnutรญ
- Pouลพรญvรกnรญ funkcรญ zpฤtnรฉho volรกnรญ v Node.js mรก svรฉ nevรฝhody. Nฤkdy bฤhem procesu vรฝvoje mลฏลพe vnoลenรฉ pouลพitรญ funkcรญ zpฤtnรฉho volรกnรญ zpลฏsobit, ลพe kรณd bude sloลพitฤjลกรญ a obtรญลพnฤ se udrลพuje.
- Vฤtลกinu problรฉmลฏ s vnoลenรฝmi funkcemi zpฤtnรฉho volรกnรญ lze zmรญrnit pouลพitรญm slibลฏ a generรกtorลฏ v node.js
- Promise je hodnota vrรกcenรก asynchronnรญ funkcรญ, kterรก oznaฤuje dokonฤenรญ zpracovรกnรญ provรกdฤnรฉho asynchronnรญ funkcรญ.
- Sliby mohou bรฝt vnoลeny do sebe, aby kรณd vypadal lรฉpe a snรกze se udrลพoval, kdyลพ je tลeba volat asynchronnรญ funkci po jinรฉ asynchronnรญ funkci





