ES6 Promises – Appel de fonctions synchrones dans la chaîne de promesses

Je suis actuellement en train d’expérimenter des promesses et j’ai une question très basique!

Dans une chaîne de promesses, serait-il une mauvaise pratique d’appeler une fonction synchrone? Par exemple:

.then(function(results) { if(checkIfResultInMemory(results) === true){ return getTotalFromMemory() } return results; }) 

Ou est-ce que mes fonctions de synchronisation devraient être refacturées pour retourner aussi les promesses?

Dans une chaîne de promesses, serait-il une mauvaise pratique d’appeler une fonction synchrone?

Non, ce n’est pas une mauvaise pratique du tout. C’est l’une des nombreuses pratiques attendues et utiles.

Vous êtes parfaitement libre d’appeler des fonctions synchrones dans la chaîne de promesse (depuis des gestionnaires .then() ) ou asynchrones qui renvoient ensuite une nouvelle promesse.

Lorsque vous renvoyez quelque chose d’un gestionnaire .then() , vous pouvez renvoyer une valeur (qui devient la valeur résolue de la promesse parent) ou vous pouvez renvoyer une autre promesse (chaîne enchaînée sur la promesse précédente) ou vous pouvez lancer la commande suivante: renvoyer une promesse refusée (la chaîne de promesse devient rejetée).

Cela signifie donc que vous pouvez appeler une fonction synchrone et en obtenir une valeur ou appeler une fonction asynchrone et obtenir une autre promesse, puis renvoyer à partir du gestionnaire .then() .

Toutes ces choses synchrones sont parfaitement légales et chacune a son propre objective. Voici quelques événements synchrones dans le gestionnaire .then() :

 // modify resolved value someAsync().then(function(val) { return val + 12; }); // modify resolved value by calling some synchronous function to process it someAsync().then(function(val) { return someSynchronousFunction(val); }); // synchronously check the value and throw to change the promise chain // to rejected someAsync().then(function(val) { if (val < 0) { throw new Error("value can't be less than zero"); } return val; }); // synchronously check the value and return a rejected promise // to change the promise chain to rejected someAsync().then(function(val) { if (val < 0) { return Promise.reject("value can't be less than zero"); } return val; }); 

Voici un petit exemple d'opération asynchrone qui renvoie une promesse suivie de trois gestionnaires .then() synchrones, puis la valeur finale:

 function delay(t, val) { return new Promise(function(resolve) { setTimeout(function() { resolve(val); }, t); }); } function increment5(val) { return val + 5; } delay(500, 10).then(increment5).then(function(val) { return val - 3; }).then(function(final) { document.write(final); }); 

Une fonction then rappel devrait:

  • retourner une autre promesse
  • retourne une valeur synchrone (ou non définie)
  • jeter une erreur synchrone