JavaScript Riconciliazione delle operazioni sincrone e asincrone


Esempio

In alcuni casi è possibile che si desideri racchiudere un'operazione sincrona all'interno di una promessa per impedire la ripetizione nei rami del codice. Prendi questo esempio:

if (result) { // if we already have a result
  processResult(result); // process it
} else {
  fetchResult().then(processResult);
}

I rami sincroni e asincroni del codice precedente possono essere riconciliati avvolgendo in modo ridondante l'operazione sincrona all'interno di una promessa:

var fetch = result
  ? Promise.resolve(result)
  : fetchResult();

fetch.then(processResult);

Quando si esegue il caching del risultato di una chiamata asincrona, è preferibile memorizzare nella cache la promessa anziché il risultato stesso. Ciò garantisce che è necessaria solo un'operazione asincrona per risolvere più richieste parallele.

È necessario prestare attenzione per invalidare i valori memorizzati nella cache quando si verificano condizioni di errore.

// A resource that is not expected to change frequently
var planets = 'http://swapi.co/api/planets/';
// The cached promise, or null
var cachedPromise;

function fetchResult() {
    if (!cachedPromise) {
        cachedPromise = fetch(planets)
            .catch(function (e) {
                // Invalidate the current result to retry on the next fetch
                cachedPromise = null;
                // re-raise the error to propagate it to callers
                throw e;
            });
    }
    return cachedPromise;
}