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.

Pล™รญslib Node.js

  1. 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.
  2. 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

Zpฤ›tnรก volรกnรญ do 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"
            }
        });
    }); 

Code Vysvฤ›tlenรญ:-

  1. Prvnรญ ฤรกstรญ je zahrnutรญ modulu 'promise', kterรฝ nรกm umoลพnรญ pouลพรญvat funkci slibu v naลกem kรณdu.
  2. 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รฉ.
  3. 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

  1. Pouลพijte EmployeeDB
  2. 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ลฏ.

Zachรกzenรญ s vnoล™enรฝmi sliby

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รญ:-

  1. 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.
  2. 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.

Vytvoล™enรญ vlastnรญho pล™รญslibu

Code Vysvฤ›tlenรญ:-

  1. 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รญ.
  2. 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.
  3. 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.
  4. 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.
  5. 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.

Vytvoล™enรญ vlastnรญho pล™รญslibu

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

Shrลˆte tento pล™รญspฤ›vek takto: