Nell'ultima versione di lingue come TypeScript o ECMAScript puoi usare async
/ await
costrutti per scrivere codice che combina la struttura pulita della programmazione sincrona con i vantaggi prestazionali del codice asincrono.
Prendi questo come esempio:
async function isAdmin() {
// Async IO request...
return false;
}
async function doSomething() {
if (await isAdmin()) {
console.log("Done");
} else throw new Error("Unauthorized");
}
doSomething();
Sembra molto pulito. Tuttavia, a causa dell'aspetto sincrono del codice, non è difficile dimenticare await
su qualche invocazione di funzione, scrivendo cose del genere:
// ...
if (isAdmin()) {
console.log("Done");
} else throw new Error("Unauthorized");
che è pericolosamente sbagliato.
Qual è la logica alla base di questa scelta, invece di attendere tutte le funzioni asincrone di default e lasciare che il programmatore scelga l'operazione in modo asincrono? Qualcosa come questa sintassi inventata:
var admin = isAdmin(); // wait isAdmin to return a result
async doSomething(); // call doSomething asynchronously
doSomething(); // call doSomething synchronously
var promise = async doSomething(); // Get the underlying Promise