Si riparte alla grandissima con Node.js ragazzi, ecco una piccola guida che può darvi una mano e chiarire alcuni concetti su quest’importante framework.
Node.js Funzioni Asincrone
process.nextTick(fn): esegue fn immediatamente, durante il ciclo corrente dell’event loop
setTimeout(fn, x): si attende un tempo x (in millisecondi) prima di eseguire la funzione fn. Il tempo effettivo di attesa può essere più lungo (x definisce il tempo minimo di attesa)
setImmediate(fn): analogo a setTimeout(fn, 0)
Promises: vedi oltre
CallBack
Il primo metodo che vediamo è quello delle callback, in quanto più intuitivo.
Le funzioni asincrone basate su callback ricevono una funzione come parametro, che verrà chiamata quando l’operazione di I/O è conclusa, o il timer è scaduto.
Per convenzione il primo parametro della funzione di callback è un oggetto di tipo Error. Se il primo parametro è null, la funzione è stata eseguita correttamente.
Promise
Una Promise è un costrutto Javascript che rappresenta un valore che al momento dell’esecuzione non è conosciuto (ma che si promette verrà restituito prima o poi).
Ci viene in aiuto per risolvere il problema del callback hell
promise 2
Una Promise può avere tre stati:
- Pending: la Promise è in esecuzione, ancora non sappiamo qual è lo stato.
- Fulfilled: la Promise ha ottenuto un risultato che sarà visibile nel blocco then()
- Rejected: la Promise ha mostrato un errore che sarà visibile nel blocco catch()
promise 3
Utilizzando le Promise è più facile gestire le eccezioni.
Quando concateniamo più Promise attraverso l’API then(), possiamo avere un singolo blocco catch() per gestire qualsiasi eccezione sia capitata durante l’esecuzione.
Si può aggiungere un blocco finally() che viene eseguito a prescindere dall’esito dell’esecuzione della Promise
promise 4
new Promise((resolve, reject) => { // Codice asincrono }) .then(() => { // Eseguito quando resolve() viene chiamata nella Promise }) .catch((err) => { // Eseguito quando reject(err) viene chiamata nella Promise }) .finally(() => { // Eseguito comunque vada, dopo then() o catch() })
Asyinc Await
Rappresentano ciò che viene chiamato Syntactic Sugar ossia un modo esteticamente migliore per rappresentare le Promise.
Sono funzioni delle Promise che ritornano e possono essere viste come una versione “sincrona” delle Promise (ma è solo sintassi!)
/ Some random async functions that deal with value
async function thingOne() { … }
async function thingTwo(value) { … }
async function thingThree(value) { … }
async function doManyThings() {
var result = await thingOne();
var resultTwo = await thingTwo(result);
var finalResult = await thingThree(resultTwo);
return finalResult;
Asyinc Library
Async è invece una libreria open source per il controllo di flusso di operazioni asincrone.
Scaricabile gratuitamente da https://github.com/caolan
Implementa numerosi helper per
- Collections: each(), filter(), reduce()
- Flow Control: times(), whilst(), doWhilst(), forever()…
- Utility: log(), timeout()
Se la guida ti è piaciuta dai un’occhiata al nostro Corso Node.js in aula e da remoto oppure scrivici per un percorso di formazione personalizzato a amministrazione@laramind.com.