V predchádzajúcich tutoriáloch by ste videli funkcie spätného volania, ktoré sa používajú pre asynchrónne udalosti. Niekedy sa však funkcie spätného volania môžu stať nočnou morou, keď sa začnú vnoriť, a program začne byť dlhý a zložitý.
V tomto návode sa naučíte
- Čo sú sľuby?
- Spätné volania na sľuby
- Zaoberanie sa vnorenými sľubmi
- Vytvorenie vlastného prísľubu
Čo sú sľuby?
Predtým, ako začneme s prísľubmi, najskôr sa pozrime, čo sú funkcie „spätného volania“ v Node.js. Tieto funkcie spätného volania sme videli veľa v predchádzajúcich kapitolách, preto si rýchlo prejdime jednu z nich.
Nasledujúci príklad ukazuje útržok kódu, ktorý sa používa na pripojenie k databáze MongoDB a na vykonanie operácie aktualizácie jedného zo záznamov v databáze.
-
Vo vyššie uvedenom kóde je časť funkcie (err, db) známa ako deklarácia anonymnej funkcie alebo funkcie spätného volania. Keď MongoClient vytvorí pripojenie k databáze MongoDB, po dokončení operácie pripojenia sa vráti k funkcii spätného volania. Takže v istom zmysle sa operácie spojenia dejú na pozadí, a keď je hotové, volá našu funkciu spätného volania. Pamätajte, že toto je jeden z kľúčových bodov Node.js, ktorý umožňuje súčasné vykonávanie mnohých operácií, a teda nebráni žiadnemu používateľovi v vykonaní operácie.
-
Druhý blok kódu sa vykoná, keď sa skutočne volá funkcia spätného volania. Funkcia spätného volania iba aktualizuje jeden záznam v našej databáze MongoDB.
Aký je teda prísľub? Sľub je iba vylepšením funkcií spätného volania v Node.js. Počas životného cyklu vývoja môže existovať inštancia, v ktorej by ste museli vnoriť viac funkcií spätného volania dohromady. To môže byť v určitom okamihu trochu chaotické a náročné na údržbu. Stručne povedané, prísľubom je vylepšenie spätných volaní, ktoré smeruje k zmierneniu týchto problémov.
Základná syntax sľubu je uvedená nižšie;
var promise = doSomethingAync()promise.then(onFulfilled, onRejected)
- „doSomethingAync“ je akékoľvek spätné volanie alebo asynchrónna funkcia, ktorá vykonáva určitý druh spracovania.
- Tentokrát sa pri definovaní spätného volania vráti hodnota, ktorá sa nazýva „sľub“.
- Keď sa sľub vráti, môže mať 2 výstupy. Toto je definované v doložke „then“. Buď môže byť operácia úspešná, čo sa označuje parametrom „onFulfilled“. Alebo môže mať chybu, ktorá je označená parametrom 'onRejected'.
Poznámka: Kľúčovým aspektom sľubu je teda návratná hodnota. Pri práci s normálnymi spätnými volaniami v Node.js. neexistuje koncept návratovej hodnoty. Kvôli návratovej hodnote máme väčšiu kontrolu nad tým, ako je možné definovať funkciu spätného volania.
V nasledujúcej téme uvidíme príklad sľubov a ich prínos pre spätné volania.
Spätné volania na sľuby
Teraz sa pozrime na príklad toho, ako môžeme použiť „sľuby“ v rámci aplikácie Node.js. Aby bolo možné použiť sľuby v aplikácii Node.js, je potrebné najskôr stiahnuť a nainštalovať modul „sľub“.
Potom upravíme náš kód, ako je uvedené nižšie, ktorý pomocou sľubov aktualizuje meno zamestnanca v zbierke „Zamestnanec“.
Krok 1) Inštalácia modulov NPM
Ak chcete používať sľuby z aplikácie Node JS, je potrebný modul prísľubov. Ak chcete nainštalovať modul sľubu, spustite nasledujúci príkaz
NPM inštalácia sľub
Krok 2) Upravte kód tak, aby obsahoval sľuby
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"}});});
Vysvetlenie kódu: -
- Prvou časťou je zahrnutie modulu „sľub“, ktorý nám umožní využiť funkčnosť sľubu v našom kóde.
- Teraz môžeme k našej funkcii MongoClient.connect pripojiť funkciu „then“. Toto teda robí to, že keď sa nadviaže spojenie s databázou, musíme vykonať fragment kódu, ktorý je definovaný potom.
- Na záver definujeme náš útržok kódu, ktorý slúži na aktualizáciu názvu zamestnanca zamestnanca s menom „Martin“ na „Mohan“.
Poznámka:-
Ak teraz skontrolujete obsah svojej databázy MongoDB, zistíte, že ak existuje záznam s menom zamestnanca „Martin“, bude aktualizovaný na „Mohan“.
Aby ste skontrolovali, či sú údaje správne vložené do databázy, musíte v MongoDB vykonať nasledujúce príkazy
- Použite EmployeeDB
- db.Employee.find ({EmployeeName: Mohan})
Prvé vyhlásenie zaručuje, že ste pripojení k databáze EmployeeDb. Druhé vyhlásenie vyhľadáva záznam, ktorý má meno zamestnanca „Mohan“.
Zaoberanie sa vnorenými sľubmi
Pri definovaní sľubov je potrebné poznamenať, že samotná metóda „potom“ vráti prísľub. Takže v určitom zmysle môžu byť sľuby navzájom vnorené alebo pripútané reťazami.
V príklade nižšie používame reťazenie na definovanie 2 funkcií spätného volania, pričom obidve vkladajú záznam do databázy MongoDB.
( Poznámka : Reťazenie je koncept, ktorý sa používa na vzájomné prepojenie vykonávania metód. Predpokladajme, že keby vaša aplikácia mala 2 metódy nazývané „methodA“ a „methodB.“ A logika bola taká, že „methodB“ by sa malo volať po „methodA“, potom by ste vykonanie reťaze spojili takým spôsobom, že sa metóda „methodB“ zavolá priamo po položke „methodA.“)
V tomto príklade je potrebné poznamenať, že kód sa stáva čistejším, čitateľnejším a udržiavateľným pomocou vnorených sľubov.
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"})})});
Vysvetlenie kódu: -
- Teraz definujeme 2 klauzuly „then“, ktoré sa vykonajú jedna za druhou. V prvej klauzule potom odovzdávame parameter 'db', ktorý obsahuje naše databázové pripojenie. Potom používame vlastnosť kolekcie spojenia „db“ na vkladanie záznamov do kolekcie „Zamestnanec“. Na vloženie skutočného dokumentu do zbierky Zamestnanec sa používa metóda „insertOne“.
- Potom použijeme klauzulu 2. typu tiež na vloženie ďalšieho záznamu do databázy.
Ak teraz skontrolujete obsah svojej databázy MongoDB, nájdete dva záznamy vložené do databázy MongoDB.
Vytvorenie vlastného prísľubu
Vlastný prísľub je možné vytvoriť pomocou uzlového modulu s názvom „q“. Knižnicu 'q' je potrebné stiahnuť a nainštalovať pomocou správcu balíkov uzlov. Po použití knižnice 'q' je možné zavolať metódu "denodeify", ktorá spôsobí, že sa z ktorejkoľvek funkcie stane funkcia, ktorá vráti prísľub.
V príklade nižšie vytvoríme jednoduchú funkciu s názvom „Pridať“, ktorá pridá dve čísla. Túto funkciu prevedieme na funkciu, ktorá vráti prísľub.
Keď to bude hotové, použijeme prísľub vrátený funkciou Add na zobrazenie správy v console.log.
Poďme podľa nasledujúcich krokov vytvoriť svoju vlastnú funkciu na vrátenie sľubu.
Krok 1) Inštalácia modulov NPM
Na použitie znaku „q“ v rámci aplikácie Node JS je potrebný modul „q“. Ak chcete nainštalovať modul „q“, spustite nasledujúci príkaz
npm nainštalovať q
Krok 2) Definujte nasledujúci kód, ktorý sa použije na vytvorenie vlastného prísľubu.
Vysvetlenie kódu: -
- Prvým bitom je zahrnutie knižnice „q“ pomocou kľúčového slova require. Pomocou tejto knižnice budeme schopní definovať ľubovoľnú funkciu na vrátenie spätného volania.
- Vytvárame funkciu s názvom Pridať, ktorá pridá 2 čísla definované v premenných a a b. Súčet týchto hodnôt bude uložený v premennej c.
- Potom používame knižnicu q na denodifikáciu (metóda použitá na prevod ľubovoľnej funkcie na funkciu, ktorá by vrátila prísľub) našej funkcie Add alebo inak previesť našu funkciu Add na funkciu, ktorá vráti prísľub.
- Teraz voláme našu funkciu „Pridať“ a sme schopní získať sľubnú hodnotu vrátenia kvôli predchádzajúcemu kroku, ktorý sme vykonali pri denodeifikácii funkcie Pridať.
- Použité kľúčové slovo „then“ určuje, že ak je funkcia úspešne vykonaná, potom v súbore console.log zobrazte reťazec „Pridaná funkcia dokončená“.
Keď je spustený vyššie uvedený kód, výstup „Funkcia pridania dokončená“ sa zobrazí v konzole.log, ako je uvedené nižšie.
Zhrnutie
- Používanie funkcií spätného volania v Node.js má svoje nevýhody. Niekedy počas procesu vývoja môže vnorené použitie funkcií spätného volania spôsobiť, že bude kód chaotickejší a bude sa ťažšie udržiavať.
- Väčšinu problémov s vnorenými funkciami spätného volania je možné zmierniť použitím sľubov a generátorov v node.js
- Prísľub je hodnota vrátená asynchrónnou funkciou, ktorá označuje dokončenie spracovania vykonávaného asynchrónnou funkciou.
- Sľuby môžu byť navzájom vnorené, aby kód vyzeral lepšie a ľahšie sa udržiaval, keď je potrebné zavolať asynchrónnu funkciu po inej asynchrónnej funkcii