Comment créer des boucles synchrones avec des chaînes de promesses
Problème :
Construire une boucle pour garantir l’exécution synchrone des appels de promesse et des instructions de journalisation ultérieures peut s’avérer difficile. Cela est particulièrement vrai lorsque vous utilisez des bibliothèques comme Bluebird.
Solution 1 (fonction promiseWhile simplifiée) :
<code class="javascript">var Promise = require('bluebird'); var promiseWhile = function(condition, action) { var resolver = Promise.defer(); var loop = function() { if (!condition()) return resolver.resolve(); return Promise.cast(action()) .then(loop) .catch(resolver.reject); }; loop(); return resolver.promise; };</code>
Cette version simplifiée de la fonction promiseWhile nécessite de transmettre des rappels comme arguments aux paramètres de condition et d'action.
Solution 2 (utilisation de la réduction de tableau) :
Une approche alternative consiste à réduire un tableau d'adresses e-mail et à créer un async correspondant appel pour chacun :
<code class="javascript">function fetchUserDetails(arr) { return arr.reduce(function(promise, email) { return promise.then(function() { return db.getUser(email).done(function(res) { logger.log(res); }); }); }, Promise.resolve()); }</code>
Cette approche crée une chaîne plate .then() et maintient l'ordre d'origine des réponses.
Utilisation :
L'appel de fetchUserDetails nécessite un tableau d'adresses e-mail :
<code class="javascript">fetchUserDetails(arrayOfEmailAddys).then(function() { console.log('all done'); });</code>
Cette approche élimine le besoin d'un compteur externe ou d'une fonction de condition. La limite est déterminée par la longueur du tableau d'e-mails.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!