NodeJS promise

In questo articolo inizieremo a parlare di “promise” relativamente a NodeJS.

NodeJS le promise

Nell’ìarticolo precedente (Link) abbiamo visto le funzioni di callback per eseguire codice asincrono. Bene, diciamo che queste funzioni di callback possono avere un brutto aspetto qualora debbano essere concatenate tra loro, portando ad un concetto di “callback Hell” (l’inferno delle callback). osserviamo il seguente codice…

/* NodeJs esempio di callback concatenate */
primaRichiesta(function(risposta) {  
    secondaRichiesta(risposta, function(seconda risposta) {    
        terzaRichiesta(rispostaSuccessiva, function(terza risposta (Finale)) {     
            console.log('Risposta finale: ' + rispostaFinale);    
        }, callbackFallimento);  
    }, callbackFallimento);
}, callbackFallimento);

Cosa sono allora le promise?

In realtà le promise sono un sistema alternativo di utilizzo dello stesso concetto di callback. Rappresentano una “promessa” di un ritorno. Una promise, come una promessa, potrà essere effettuata oppure rifiutata. Di seguito un esempio di promise…

/* NodeJS esempo di una promise */
const myPromise = new Promise((resolve, reject) => {  
    let condizione;  
    if(condizione è vera) {    
        resolve('Risoluzione con successo.');  
    } else {    
        reject('Promise rifiutata');  
    }
});

Una promise viene creata specificando due valori, uno per la risoluzione (promessa mantenuta), l’altro per il rifiuto della promessa. I due parametri, come vediamo nell’esempio, sono generalmente definiti con ‘resolve’ e ‘reject’ ma possiamo utilizzare i nomi che ci aggradano di più come ‘risolta’ e ‘rifiutata’ oppure ‘mantenuta’ e ‘nonMantenuta’. il mio consiglio è di utilizzare ‘resolve’ / ‘reject’ o al massimo ‘res’ / ‘rej’ in modo da rientrare all’interno di uno standard “de facto”.

Ovviamente ‘resolve’ e ‘reject’ utilizzati all’interno della condizione per ‘mantenere’ o ‘rifiutare’ la promise devono essere uguali a quanto definito come parametro nella creazione della promise. Altro esempio…

/* NodeJS esempo di una promise con parametri diversi*/
const myPromise = new Promise((res, rej) => {  
    let condizione;  
    if(condizione è vera) {    
        res('Risoluzione con successo.');  
    } else {    
        rej('Promise rifiutata');  
    }
});

Come potete notare, ‘resolve’ e ‘reject’ sono stati modificati in ‘res’ e ‘rej’ ed utilizzati anche per mantenere o rifiutare la promise.

Ma come gestiamo una promise?

Il ritorno di una promise viene gestito attraverso due “metodi” della promise che sono “then” e “catch”. Se la promise è stata “Mantenuta”, quindi ha avuto esito positivo, allora sarà eseguito il codice presente nel corpo di “then” (la sua callback); se, invece, la promise è stata rifiutata, allora interviene il blocco “catch” (la sua callback) come nell’esempio che segue (che fa riferimento alla promise creata nel codice precedente)…

/* Gestione di una promise in nodeJS */
myPromise.then((messaggio) => { //Promessa mantenuta
    console.log(messaggio);
}).catch((messaggio) => { //Promessa rifiutata
    console.error(messaggio);
});

Si, state pensando bene, la stessa cosa l’avremmo fatta anche utilizzando delle semplici “callback” ma ora date uno sguardo al codice seguente…

/* NodeJs Concatenazione di più promise */
primaRichiesta()
  .then(function(risposta) {
    return secondaRichiesta(risposta);
}).then(function(rispostaSuccessiva) {  
    return terzaRichiesta(rispostaSuccessiva);
}).then(function(rispostaFinale) {  
    console.log('Risposta finale: ' + rispostaFinale);
}).catch(callbackFallimento);

Dove ogni richiesta rappresenta una promise. La concatenazione, ora, è molto più pulita è questo solo grazie alle promise. Questo costrutto è possibile considerando che una promise ritorna, come risultato, ancora una promise.

Il blocco ‘catch’ in questo caso, è uno soltanto e viene eseguito quando una delle richieste falllisce. Più bello da vedere, vero!?

Tanto ci sarebbe da dire sulle promise ma, come al solito, non è lo scopo di questo spazio. Ora che le ho presentate (a chi non le conoscessero) sta a voi andare a cercare i dettagli in rete.

Per questo articolo è tutto, prossimamente parleremo delle funzioni async/await altro grande elemento introdotto in nodeJS.

Alla prossima e… buona programmazione a tutti.

Data di ultima modifica 29 Gennaio 2024