Analiză: Callbacks vs Promises

Oameni buni, înainte de a vă adânci celulele gri în versurile modificate menționate mai sus din Call Me Maybe (Carly Rae Jepsen) :), permiteți-ne împăcați-vă cu faptul că acest articol din toate punctele de vedere este un articol analitic pentru a înțelege abordarea asincronă a Javascript!

Totuși, dacă doriți să vă umpleți în secret urechile cu numărul melodios, vă las linkul aici: https://www.youtube.com/watch?v=fWNaR-rxAic

Abordarea asincronă și Javascript(JS)au luat naștere mână în mână. Acest lucru se datorează în totalitate structurii de proiectare a JS, care îl obligă să se conecteze cu lumea instrumentelor asincrone. Deoarece există doar un singur fir de execuție în JS, alinierea cu abordarea sincronă oferă o mulțime de timp de execuție inactiv, care ar putea fi utilizat în mod eficient pentru realizarea altor sarcini [barebones of asynchronous abordare ]

Următoarea figură vă poate ajuta să înțelegeți ideea: Rețineți că axa X este timpul incremental, iar axa Y sunt evenimentele -›

Acum întrebarea este cum realizăm asincronizarea! Voi prezenta doi concurenți care au luptat cu curaj în lupta asincronă și anume Reapeluri și promisiuni!

Bună, numele meu este PD:) și încerc să stabilesc o întâlnire cu această fată de alături, Bee[porecla ei]. Într-o încercare disperată de a stabili data, îi formez numărul cu o nuanță de speranță! Ea răspunde la telefon și eu ezit să o invit să iasă. Cu mare teamă, o întreb și ea îmi răspunde „Aaaa..PD.. Vă anunț într-o oră”. Îmi duc asta la bărbie și continui să-mi fac activitățile zilnice, cum ar fi să fac baie, să conduc la birou, să iau micul dejun... Vreau să spun că răspunsul ei nu mă împiedică să urmez celelalte activități esențiale pe care trebuie să le fac! Mai târziu, după o oră, voi afla răspunsul ei! Această poveste are o corelație strânsă cu CALLBACK-urileîn Javascript.

Callbackeste o abordare în care firul de execuție nu așteaptă în esență ca un eveniment să se termine! Dacă există un eveniment care necesită mult timp, firul de execuție va continua să efectueze toate evenimentele și va împinge execuția evenimentului care necesită timp la un apel invers. Scopul unui callback este gestionat intenționat de o funcție de primă clasă [fir de lucru], execută evenimentul care necesită mult timp și, odată ce evenimentul se termină, notifică firul principal despre stare. Vă rugăm să urmați exemplul:

Cod:

Consola:

Explicație:

Primele două rezultate sunt că eu fac activitățile zilnice, în timp ce încă aștept un răspuns DA/NU de la ea. Deci, funcția ReplyFromBeeeste practic un apel invers, se ocupă de răspunsul de la doamna fermecătoare și ori de câte ori este gata să-mi dea răspunsul, funcția are grijă! [Aici am folosit funcția setTimeoutpentru a emula condiția și i-am dat un timp de așteptare de 4000 de milisecunde]. Maturul asincron este deci stabilit!

Acum, revenind la povestea originală, [PD] mă pregătesc pentru întâlnire, dar am o dilemă. Va spune ea DAsau va fi un NU? Cu toate acestea, pentru a mă lăuda cu statutul meu printre prietenii mei, continui să hype și să mă pregătesc pentru întâlnire, în cazul în care ea spune DA. În funcție de răspunsul ei, ar trebui să rezerv o masă, să închiriez un smoking și Ia-o cu AUDI-ul meu. [deși nu am niciunul în realitate]. Phewwwwwwwww!!

Dacă analizăm situația de mai sus, constatăm că cererea mea pentru o Data poate fi clasificată în trei scenarii plauzibile:

  • În așteptare:care este starea mea acum!
  • Rezolvat:Ea spune DAși primesc o DATĂ :) :) :) :)
  • Respins::( :( :( :`( :(

Promisiunileîn Javascript sunt promisiuni în viața reală. Beea promis că îi va da răspunsul într-un anumit interval de timp și am trei scenarii posibile [stare în termeni oficiali]. În funcție de răspunsul ei, pot face pași suplimentari, nici înainte, nici după. Să ne adâncim într-un cod de promisiune:

Cod:

Explicația codului:

Funcția willIGetADate [ Promise creator ]folosește constructorul de promisiuni JS, care ia în considerare două argumente și anume resolveși reject. În funcție de valoarea variabilei booleene BeeResponse, luăm acțiuni ulterioare și trecem rezultatul în parametrii de rezolvare sau de respingere. Pe de altă parte, funcția askBee este un consumator de promisiune, adică consumă promisiunea willIGetADate și emite rezultatul posibil. Vă rugăm să acordați atenție utilizării .then și .catch, care acționează pe metoda de creare a Promise și transmite valoarea îndeplinită. Dar, care este valoarea împlinită? Valoarea împlinităeste exact valoarea pe care o transmiteți în promisiunea dvs. resolve(your_success_value). Prin urmare, va fi dataobiectîn cazul nostru. În mod similar, în porțiunea .catch, error.messagenu este altceva decât valoarea pe care o transmitem în reject(your_fail_value). De aceea, va fi un motivîn cazul nostru. Să verificăm rezultatul.

Ieșire din consolă:

Diferența fundamentală dintre ambele, fiecare având același scop, este compozibilitatea lor, ceea ce înseamnă, practic, că combinarea mai multor promisiuni [promise chain] funcționează, dar combinarea mai multor callback-uri lasă loc unui cod dezordonat [callback hell] ]. Chiar și din punct de vedere al lizibilității, Promises arată succint, clar și iese în evidență din apeluri inverse.

Rețineți, este corect să spunem că promisiunile sunt doar zahăr sintactic. Tot ce poți face cu promisiuni, poți face cu apeluri inverse.

Este bine de știut că există un copil nou în bloc numit Observables, ceea ce reduce efortul de a introduce concurența în aplicație, forțând aplicația să se înregistreze la un flux de evenimente. Voi discuta despre asta la următoarea întâlnire.

Până atunci lasă-mă să merg să petrec timp cu Bee! Codare fericită.. :)