Come evitare l'inferno delle richiamate in Node.js

Blog

Come evitare l'inferno delle richiamate in Node.js

Richiamare l'inferno è un fenomeno che affligge uno sviluppatore JavaScript quando cerca di eseguire più operazioni asincrone una dopo l'altra. Alcune persone lo chiamano per essere il piramide del destino .



Diamo un'occhiata a un esempio di ciò che chiamiamo inferno di callback.

doSomething(param1, param2, function(err, paramx){ doMore(paramx, function(err, result){ insertRow(result, function(err){ yetAnotherOperation(someparameter, function(s){ somethingElse(function(x){ }); }); }); }); });

Nota- Il codice sopra è per la dimostrazione e non un codice funzionante.



Questo sembra brutto solo dallo scheletro stesso. Nel codice reale avrai ovviamente altre istruzioni come |_+_|, |_+_| o alcune altre operazioni insieme a queste funzioni nidificate. Aggiungi quelli al codice sopra e diventerebbe davvero disordinato e ingestibile.

Aggiornamento: aggiunto l'incredibile async-await dopo il suo rilascio in Node.js 7.10.0



Suggerimento professionale

Non sovraccaricare le tue funzioni. La maggior parte delle volte potrebbe essere possibile che il vero problema che stai affrontando non sia il inferno di richiamata , piuttosto sono funzioni scritte male. In questi casi, le soluzioni che vedremo di seguito strutturano il tuo codice ma non risolveranno il tuo vero problema. Quindi, come regola generale, fai in modo che la tua funzione faccia meno, il che significa che scrivi piccole funzioni che svolgono una singola attività.

Tecniche per evitare l'inferno del callback

Esistono diverse tecniche per affrontare l'inferno di callback. In questo tutorial, daremo un'occhiata ai due seguenti in particolare.

  1. Utilizzo di Async.js

  2. Usando le promesse

  3. Utilizzo di Async-Await

Gestione delle richiamate utilizzando Async.js

Asincrono è un modulo npm davvero potente per la gestione della natura asincrona di JavaScript. Insieme a Node.js, funziona anche per JavaScript scritto per i browser.

Async fornisce molte potenti utilità per lavorare con processi asincroni in diversi scenari.

sostituire più caratteri python

Installazione

if

asincrono.cascata()
Per il nostro problema, esamineremo in particolare due funzioni di asincrono. cioè |_+_| e |_+_|
Async Waterfall è utile quando si desidera eseguire alcune attività una dopo l'altra e allo stesso tempo trasferire il risultato dall'attività precedente alla successiva.

|_+_| accetta un array di funzioni |_+_| e un finale |_+_| funzione che viene chiamata dopo tutte le funzioni in |_+_| hanno completato o un |_+_| viene chiamato con un errore.
Dai un'occhiata qui sotto per una migliore comprensione.

CASCATA ASINCATA

for

Quindi, usando |_+_|, scriveresti il ​​tuo codice verticalmente invece di indentarlo orizzontalmente ed entrare nella piramide del destino. Inoltre il tuo codice sarebbe molto più organizzato e facile da leggere.

serie asincrona()
Async fornisce un'altra funzione per gestire l'esecuzione in serie, |_+_|. La serie Async funziona in modo simile alla cascata Async, eseguendo le funzioni nell'array una dopo l'altra con la differenza che non passerà i dati da una funzione all'altra, invece quando tutte le funzioni hanno completato la loro esecuzione il risultato di le funzioni saranno disponibili nel callback finale come array. Simile a |_+_| in |_+_| inoltre, quando una delle funzioni viene chiamata con un callback di errore, non vengono eseguite più funzioni nell'array e viene immediatamente chiamato il callback finale con il valore dell'errore. Dai un'occhiata qui sotto per un'immagine chiara.

SERIE ASINCRONA

npm install --save async

Ci sono altre fantastiche funzioni disponibili con il modulo asincrono, assicurati di verificarle e utilizzarle nei tuoi progetti Node.js.
Visita la pagina Github qui: Async.js Github

Gestire l'inferno delle callback usando le promesse

Le promesse sono un'alternativa ai callback durante la gestione del codice asincrono. Le promesse restituiscono il valore del risultato o un'eccezione di errore. Il nucleo delle promesse è |_+_| funzione, che attende la restituzione dell'oggetto promessa. Il |_+_| La funzione accetta due funzioni opzionali come argomenti e, a seconda dello stato della promessa, solo una verrà chiamata. La prima funzione viene chiamata quando la promessa è soddisfatta (un risultato positivo). La seconda funzione viene chiamata quando la promessa viene rifiutata.
Vediamo la struttura di una tipica promessa.

PROMESSE

async.waterfall`)

Promesse concatenate

Possiamo anche concatenare le promesse, questa è un'alternativa equivalente ai callback nidificati. Ci sono due modi per concatenare le promesse. Le promesse possono essere concatenate all'interno o all'esterno dei gestori (funzione .then()). Il concatenamento delle promesse all'esterno dell'handle è molto pulito e facile da leggere, ma potrebbe essere necessario concatenare le promesse all'interno dell'handler se vogliamo utilizzare alcuni parametri nel nostro prossimo gestore che sono disponibili nell'ambito del gestore precedente. Sebbene un eccessivo concatenamento all'interno del gestore risulterà nuovamente in codice orizzontale che stiamo cercando di evitare. Possiamo anche concatenare le promesse con una combinazione di catene interne ed esterne. Come regola generale, ti consiglierei di evitare di concatenare all'interno del gestore.

Inoltre, un'altra buona parte del concatenamento delle promesse è che possiamo anche aggiungere un blocco catch alla fine della catena per rilevare qualsiasi errore che si verifica in una qualsiasi delle funzioni about.

CATENA DI PROMESSE

async.series().

Creazione di una funzione che restituisce un |_+_|
Per creare una funzione che funzioni con le promesse, possiamo utilizzare la classe Promise incorporata.

collega la mia stampante epson al wifi
async.waterfall()

Una promessa è considerata riuscita se il valore viene restituito con |_+_| metodo e non ha successo se viene restituito con |_+_| metodo.

Modificare i callback in promesse

Ci sono alcune buone librerie per le promesse, esamineremo gli esempi dal popolare Q di Kriskowal libreria di promesse Assicurati di aver installato q.

‘tasks‘

RICHIAMATE ALLE PROMESSE

‘callback‘

Utilizzo dell'attesa asincrona

Una delle cose migliori che è venuta fuori in Node.js di recente è la funzione di attesa asincrona. Async wait fa sembrare il codice asincrono sincrono. Ciò è stato possibile solo grazie alla reintroduzione delle promesse in node.js. Async-Await funziona solo con funzioni che restituiscono una promessa.

In questo momento il modo migliore per evitare l'inferno del callback è utilizzare async-await in Node.js. Capiamolo con un esempio.

ASYNC-ATTESA

tasks

Se vedi sopra abbiamo una funzione che ci restituisce un numero casuale dopo 1 sec. Questa funzione restituisce una promessa. Usando il |_+_| parola chiave diciamo a javascript di attendere il risultato prima di andare avanti. Ma questo |_+_| La parola chiave funziona solo all'interno di funzioni dichiarate come |_+_|. Quando dichiariamo una funzione come|_+_|, diciamo a javascript di sospendere l'esecuzione fino a quando non arriva il risultato ogni volta che incontra |_+_| parola chiave.

Ora, nelle promesse di gestire l'errore, potremmo concatenare direttamente un blocco catch. Come lo faresti nel caso sopra? Bene, possiamo semplicemente usare un |_+_| bloccare.
Quindi il nostro esempio sopra sarà simile a questo ...

ASYNC-ATTESA

callback

Un'altra cosa importante da notare è che ogni volta che dichiari una funzione come |_+_| quella funzione restituirà a|_+_|

Conclusione

Abbiamo visto come possiamo affrontare il problema del callback hell in Node.js. Ci sono altri modi per risolvere il problema come l'utilizzo di generatori, modularizzazione ecc. Ma riteniamo che libreria asincrona e le promesse sono le due soluzioni di fatto per affrontare l'inferno delle richiamate. Ma questo è stato solo fino all'arrivo di |_+_|. Con |_+_| qui dovresti iniziare immediatamente a usarlo nei tuoi programmi per ripulire e organizzare il tuo codice. Tuttavia, ricorda ciò di cui abbiamo discusso in precedenza, il tuo problema principale potrebbe non essere l'inferno di callback, potrebbero essere funzioni scritte male. Assicurati di mantenere le tue funzioni magre e concentrate su un singolo compito. Imparerai di più su asincroni e promesse solo quando li utilizzerai. Quindi assicurati di provarli la prossima volta nei tuoi progetti.

Grazie per aver letto !

#node #nodejs #javascript