如何使用 Promise 链创建同步循环
问题:
构造一个循环确保 Promise 调用和后续日志记录语句的同步执行可能具有挑战性。使用 Bluebird 这样的库时尤其如此。
解决方案 1(简化的 PromiseWhile 函数):
<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>
这个简化版本的 PromiseWhile 函数需要将回调传递为条件和操作参数的参数。
解决方案 2(使用数组缩减):
另一种方法是缩减电子邮件地址数组并进行相应的异步调用每个:
<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>
此方法创建一个平坦的 .then() 链并保持响应的原始顺序。
用法:
调用 fetchUserDetails 需要一组电子邮件地址:
<code class="javascript">fetchUserDetails(arrayOfEmailAddys).then(function() { console.log('all done'); });</code>
这种方法消除了对外部计数器或条件函数的需要。该限制由电子邮件数组的长度决定。
以上是以下是一些适合所提供文章的问题式标题: * 如何使用 Promise 链实现同步执行:简化 `promiseWhile` 和数组缩减技术指南 * S的详细内容。更多信息请关注PHP中文网其他相关文章!