Pochopenie prísľubov JavaScriptu pre figuríny

Vyskúšajte Náš Nástroj Na Odstránenie Problémov

Pochopenie prísľubov JavaScriptu pre figuríny

Sľuby Javascriptu nie sú ťažké. Mnoho ľudí to však na začiatku považuje za trochu ťažké pochopiť. Preto by som chcel zapisovať spôsob, akým chápem sľuby, atrapou.

Obsah

  • Pochopenie sľubov
  • Vytvorenie sľubu
  • Dodržiavanie sľubov
  • Reťazové sľuby
  • Sľuby sú asynchrónne
  • Sľuby v ES5 , ES6 /2015, ES7/Ďalej
  • Prečo ich sľúbiť a kedy ich použiť?
  • New Kid On the Block: Pozorovateľné
  • Zhrnutie

Pochopenie sľubov

Stručne povedané, sľub:

Predstavte si, že ste a dieťa . Tvoja mama sľuby ty, že ti získa a nový telefón budúci týždeň.



Vy neviem ak ten telefón dostanete do budúceho týždňa. Aj tvoja mama môže naozaj kúpiť ste úplne nový telefón, alebo vstaň a podržte telefón, ak nie je šťastná :(.

Toto je sľub . Sľub má 3 štáty. Oni sú:

  1. Čakajúce: Vy neviem ak dostanete ten telefón
  2. Splnené: Mama je šťastná, kupuje vám úplne nový telefón
  3. Odmietnuté: Vaša mama je šťastná, zadržiava telefón

Vytvorenie prísľubu JavaScriptu

Premeňme to na JavaScript.

/_ ES5 _/ var isMomHappy = false; // Promise var willIGetNewPhone = new Promise( function (resolve, reject) { if (isMomHappy) { var phone = { brand: 'Samsung', color: 'black' }; resolve(phone); // fulfilled } else { var reason = new Error('mom is not happy'); reject(reason); // reject } } );

Kód je sám o sebe dosť expresívny.

// promise syntax look like this new Promise(/_ executor_/ function (resolve, reject) { ... } );

Dodržiavanie sľubov

Teraz, keď máme sľub, skonzumujme ho.

/_ ES5 _/ ... // call our promise var askMom = function () { willIGetNewPhone .then(function (fulfilled) { // yay, you got a new phone console.log(fulfilled); // output: { brand: 'Samsung', color: 'black' } }) .catch(function (error) { // oops, mom don't buy it console.log(error.message); // output: 'mom is not happy' }); }; askMom();

Ukážme si príklad a uvidíme výsledok!

Demo: https://jsbin.com/nifocu/1/edit?js,console

Reťazové sľuby

Sľuby sú reťaziteľné.

Povedzme, ty, dieťa, sľuby tvoj priateľ, že budeš Ukáž im nový telefón, keď ti ho mama kúpi.

To je ďalší prísľub. Poďme to napísať!

... // 2nd promise var showOff = function (phone) { return new Promise( function (resolve, reject) { var message = 'Hey friend, I have a new ' + phone.color + ' ' + phone.brand + ' phone'; resolve(message); } ); };

Poznámky:

// shorten it ... // 2nd promise var showOff = function (phone) { var message = 'Hey friend, I have a new ' + phone.color + ' ' + phone.brand + ' phone'; return Promise.resolve(message); };

Spojme reťaze sľubov. Vy, dieťa, môžete začať iba | _+_ | sľub po | _+_ | sľub.

showOff

Takto jednoducho je možné reťazec sľúbiť.

Sľuby sú asynchrónne

Sľuby sú asynchrónne. Zaznamenajme si správu pred a po tom, ako zavoláme sľub.

willIGetNewPhone

Aká je postupnosť očakávaného výstupu? Pravdepodobne očakávate:

... // call our promise var askMom = function () { willIGetNewPhone .then(showOff) // chain it here .then(function (fulfilled) { console.log(fulfilled); // output: 'Hey friend, I have a new black Samsung phone.' }) .catch(function (error) { // oops, mom don't buy it console.log(error.message); // output: 'mom is not happy' }); };

Skutočná postupnosť výstupu je však nasledovná:

// call our promise var askMom = function () { console.log('before asking Mom'); // log before willIGetNewPhone .then(showOff) .then(function (fulfilled) { console.log(fulfilled); }) .catch(function (error) { console.log(error.message); }); console.log('after asking mom'); // log after }

Prečo? Pretože život (alebo JS) nečaká na žiadneho muža.

Ty, dieťa, by si neprestal hrať, kým budeš čakať na prísľub svojej matky (nový telefón). Nie? To je niečo, čo nazývame asynchrónne , kód pobeží bez blokovania alebo čakania na výsledok. Čokoľvek, čo musí čakať na sľub, že bude pokračovať, vložte do | _+_ |.

Sľuby v ES5, ES6/2015, ES7/Next

ES5 - Väčšina prehliadačov

Demo kód je funkčný v prostrediach ES5 (všetky hlavné prehliadače + NodeJs), ak ho zahrnete Modrý vták sľubná knižnica. Je to pretože ES5 nepodporuje sľuby ihneď po vybalení. Ďalšou slávnou knižnicou prísľubov je Q od Krisa Kowala.

javascript previesť objekt na reťazec json

ES6 / ES2015 - Moderné prehliadače, NodeJs v6

Demo kód funguje po vybalení z krabice, pretože ES6 natívne podporuje sľuby. Navyše s funkciami ES6 môžeme kód ďalej zjednodušiť pomocou tučná šípka = > a používajte | _+_ | a | _+_ |.

Tu je príklad ES6 kód:

1. before asking Mom 2. Hey friend, I have a new black Samsung phone. 3. after asking mom

Poznamenáva, že všetky | _+_ | sa nahrádzajú | _+_ |. Všetky | _+_ | bolo zjednodušené na | _+_ |. Tieto zmeny majú niekoľko výhod. Prečítajte si viac na:-

ES7 - Async Await, aby syntax vyzerala krajšie

Predstavenie ES7 | _+_ | a | _+_ | syntax. Vďaka tomu vyzerá asynchrónna syntax krajšia a zrozumiteľnejšia bez | _+_ | a | _+_ |.

Prepíšte náš príklad syntaxou ES7.

1. before asking Mom 2. after asking mom 3. Hey friend, I have a new black Samsung phone.

Prečo ich sľúbiť a kedy ich použiť?

Prečo potrebujeme sľuby? Ako vyzerá svet pred prísľubom? Predtým, ako odpovieme na tieto otázky, vráťme sa k základu.

Normálne Funkcia vs. Asynchr Funkcia

Pozrime sa na tieto dva príklady, oba príklady vykonávajú sčítanie dvoch čísel, jedno pridanie pomocou normálnej funkcie, druhé pridanie vzdialene.

Normálna funkcia na pridanie dvoch čísel

.then
Asynchrónna funkcia na pridanie dvoch čísel
const

Ak sčítate čísla s normálnou funkciou, výsledok získate okamžite. Keď však odošlete vzdialený hovor, aby ste dosiahli výsledok, musíte počkať, nemôžete ihneď získať výsledok.

Alebo povedané takto, neviete, či získate výsledok, pretože server môže byť nefunkčný, reaguje pomaly atď. Nechcete, aby bol celý váš proces počas čakania na výsledok zablokovaný.

Volanie rozhraní API, sťahovanie súborov, čítanie súborov patrí medzi niektoré z bežných operácií asynchrónneho vykonávania.

Svet pred sľubmi: spätné volanie

Musíme pri asynchrónnom hovore použiť prísľub? Nie. Pred prísľubom používame spätné volanie. Spätné volanie je len funkcia, ktorú voláte, keď získate výsledok návratu. Upravme predchádzajúci príklad tak, aby prijal spätné volanie.

let

Syntax vyzerá dobre, prečo potom potrebujeme sľuby?

Čo keď chcete vykonať následnú asynchrónnu akciu?

Povedzme, že namiesto toho, aby sme čísla pridali iba raz, chceme ich sčítať trikrát. Pri normálnej funkcii to robíme:-

/_ ES6 _/ const isMomHappy = true; // Promise const willIGetNewPhone = new Promise( (resolve, reject) => { // fat arrow if (isMomHappy) { const phone = { brand: 'Samsung', color: 'black' }; resolve(phone); } else { const reason = new Error('mom is not happy'); reject(reason); } } ); const showOff = function (phone) { const message = 'Hey friend, I have a new ' + phone.color + ' ' + phone.brand + ' phone'; return Promise.resolve(message); }; // call our promise const askMom = function () { willIGetNewPhone .then(showOff) .then(fulfilled => console.log(fulfilled)) // fat arrow .catch(error => console.log(error.message)); // fat arrow }; askMom();

Ako to vyzerá so spätnými volaniami?

var

Demo: https://jsbin.com/barimo/edit?html,js,console

Syntax je menej užívateľsky prívetivá. Lepšie povedané, vyzerá to ako pyramída, ale ľudia to zvyčajne označujú ako peklo spätného volania, pretože spätné volanie sa vnorilo do ďalšieho spätného volania. Predstavte si, že máte 10 spätných volaní, váš kód sa vnorí 10 -krát!

Útek z pekla spätného volania

Sľuby prichádzajú na záchranu. Pozrime sa na sľubnú verziu rovnakého príkladu.

const

Demo: https://jsbin.com/qafane/edit?js,console

sql cheat sheet na pohovor

Sľubmi vyrovnáme spätné volanie s | _+_ |. Svojím spôsobom to vyzerá čistejšie, pretože nedochádza k vnoreniu spätného volania. Samozrejme, s ES7 | _+_ | syntax, tento príklad môžeme ešte vylepšiť, ale to už nechám na vás. :)

New Kid On the Block: Pozorovateľné

Predtým, ako sa uspokojíte so sľubmi, došlo k niečomu, čo ešte viac uľahčuje nakladanie s asynchrónnymi údajmi s názvom | _+_ |.

Pozorovateľné sú lenivé toky udalostí, ktoré môžu emitovať nula alebo viac udalostí a môžu, ale nemusia sa skončiť. zdroj

Niektoré kľúčové rozdiely medzi sľubmi a pozorovateľnými sú:

Nebojte sa, pozrime sa na to isté demo napísané pomocou Observables. V tomto prípade používam RxJS pre pozorovateľné.

function(resolve, reject)

Demo: https://jsbin.com/dosaviwalu/edit?js,console

Poznámky:

Pozorovateľní môžu ľahko vykonávať zábavnejšie veci. Napríklad | _+_ | pridať funkciu podľa | _+_ | iba s jedným riadkom kódu alebo to skúste znova, aby ste mohli hovor zopakovať určitý počet krát.

(resolve, reject) =>

Porozprávajme sa o Pozorovateľných v budúcom príspevku!

Zhrnutie

Zoznámte sa s spätnými volaniami a sľubmi. Pochopte ich a používajte ich. Zatiaľ si nerobte starosti s pozorovateľnými. Všetky tri môžu ovplyvniť váš vývoj v závislosti od situácie.

Tu sú demo kódy pre všetky | _+_ | príklady:

To je všetko. Dúfajme, že tento článok vám uľahčí cestu k skroteniu sľubov JavaScriptu.

Šťastné kódovanie!

#javascript

Pozri Tiež: