Callbacks VS Promises VS Async / Wawait

Mentre es desplaçava pels altaveus anunciats per a la trobada de BerlinJS durant aquestes setmanes, em vaig adonar que Mohamed Oun donarà la seva primera xerrada (molta sort per cert) sobre el darrer gran èxit de la JS, Async i espera. Així que vaig pensar que també podria fer el meu propi resum per poder comparar notes;)

De cap manera vaig a trepitjar un terreny nou amb aquest bloc, però almenys per a mi tota aquesta promesa i cosa async / espera no tenia sentit fins que la utilitzés. I això ho farem.

Per als que provenen d’altres idiomes, les promeses de benefici i Async + esperen proporcionar és una forma neta i llegible de realitzar funcions en cadena i implementar un control de flux fiable i concis. Ni més ni menys.

Tant si aneu a peu, com en bicicleta o en agafar un autobús, encara podeu arribar a on vulgueu anar. El mateix per a les devolucions de la funció Promeses VS.

Fem això → La configuració

Imaginem que tenim una aplicació node.js, que és capaç d’enviar dades d’un formulari, a un controlador, que mitjançant mongoose (inclòs una mica de middleware) s’emmagatzema al nostre DB.

Aquest escenari ens ofereix un parell d’opcions, tres bé:

Callbacks

El TLDR d’això és bàsicament que si teniu una funció múltiple que cal executar dins del nostre controlador, JS, a causa de la seva naturalesa asínica, no espereu que una funció finalitzi l’execució abans de passar a la següent. La manera com la gent va començar a evitar-ho és mitjançant la devolució de trucades com podeu veure a continuació.

Anomenem functionA, i l'execució de qualsevol funció posterior depèn de la devolució de functionA.

Ara el problema amb això comença a aparèixer quan tenim funcions més complexes. Potser necessiteu desinfectar les vostres dades, o fer validacions o crear associacions amb altres registres del DB. Arribareu ràpidament al que molts anomenen infern de trucada.

Comencem a haver de nidificar les devolucions i les coses es fan ràpidament difícils de llegir.

Promeses

Un Promise és un objecte que representa la finalització o el fracàs d'una operació asíncrona.

Podem evitar aquest embolic anidat i difícil de llegir i aconseguir el mateix objectiu mitjançant una cosa així.

Diguem que volem trobar un altre registre i crear una associació abans de guardar, sabem com podria semblar això al món de les devolucions, però amb les promeses acabem amb una cadena una mica similar a aquesta:

Les promeses ens permeten encadenar netament les operacions posteriors de la cadena, evitant l'infern de trucada i sempre que retorni una promesa per a cadascun dels vostres blocs, continuarà per la cadena.

Async / Espere

Ara el més fantàstic, sempre que la meva funció sigui declarada asínc, simplement afegint l’espera a una trucada, farà exactament el mateix que qualsevol de les solucions basades en la promesa de es6, però amb una marcació més neta.

És elegant i senzill, però el meu parer és com solucionar els errors. Les promeses periòdiques ens proporcionen un bloc de captura senzill i senzill que simplifica el tractament d’excepcions i errors, mentre que les funcions d’async realment no tenen una bona manera de detectar errors segons els meus coneixements. Així que cal fer una cosa així.

Ara no és bonic, però pel meu petit exemple, indulgiu-me. I, per descomptat, hi ha molts trucs i estratègies per afrontar això en el món real que teniu.

I allà el teniu

Una aplicació de promeses i d’async / espera en un cas d’ús quotidià a la qual gairebé tots els desenvolupadors que hi ha. Gràcies per prendre el temps per llegir-lo.

Heu detectat un error? Parlo de tonteries?

Avisa'm si creus que he rebut el final equivocat de la barra. Sóc humà, m’equivoco, sóc feliç d’aprendre d’ells :)

Fonts:

Estic en procés de veure la conversa de Wes Bos a Async + Await i no puc recomanar-ho prou si voleu saber-ne més (descriu el maneig d’errors amb molt més detall, en realitat és fantàstic). De fet, recomanaria seguir-lo en general (sóc un gran fan Wes Bos!).

La web de MDN documenta sobre Promises

Els documents web MDB sobre async + esperen