Con Javascript è possibile utilizzare il concetto di Promise, un particolare costrutto che consente di gestire i processi asincroni. Sono disponibili a partire da ECMAScript 2015, e permettono di scrivere codice semplice e quindi mantenibile. Fino a qualche anno fa, l’utilizzo delle promise era possibile solo utilizzando alcune librerie esterne, complicandone di fatto l’utilizzo.
Per poter utilizzare un oggetto promise è necessario per prima cosa crearne un’istanza passando come parametro una funzione. Questa funzione potrà avere due argomenti:
- uno per risolvere la promise
- uno per rifiutare la promise
var p = new Promise(function(resolve, reject){ if(.....){ resolve(/*value*/); } else { reject(/*message*/) } });
La chiamata a resolve consente di risolvere una Promise, mentre la chiamata reject consente di rifiutarla.
Stati della promise
Una Promise può trovarsi in 3 stati differenti:
- fullfilled (risolta): il valore della promise è disponibile, la chiamata asincrona a cui si riferisce ha restituito un valore
- rejected (rifiuta): la chiamata asincrona non ha restituito un valore (ad esempio per il verificarsi di un errore)
- pending: quando non si trova in uno dei casi precedenti
Per poter processare lo stato e l’esecuzione di una Promise si utilizzano due funzioni utilizzate concatenandole: then e catch. La funzione utilizzata come parametro all’interno di then è delegata alla gestione della promise risolva, mentre la funzione indicata come parametro all’interno di catch viene delegata alla gestione della promise rifiutata.
let r = Promise.reject("reject"); r.then(function(res){ //accept }).catch((error)=>{console.log("error");});
Ovviamente è possibile concatenare più then e catch tra loro.
Le promise vengono utilizzate, ad esempio, all’interno di chiamate REST verso API.