JavaScript Réconciliation des opérations synchrones et asynchrones


Exemple

Dans certains cas, vous pouvez vouloir envelopper une opération synchrone dans une promesse pour empêcher la répétition dans les branches de code. Prenons cet exemple:

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

Les branches synchrone et asynchrone du code ci-dessus peuvent être conciliées en encapsulant de manière redondante l'opération synchrone dans une promesse:

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

fetch.then(processResult);

Lors de la mise en cache du résultat d'un appel asynchrone, il est préférable de mettre en cache la promesse plutôt que le résultat lui-même. Cela garantit qu'une seule opération asynchrone est requise pour résoudre plusieurs requêtes parallèles.

Il faut veiller à invalider les valeurs mises en cache lorsque des conditions d'erreur sont rencontrées.

// 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;
}