首页  >  文章  >  web前端  >  以下是一些适合所提供文章的问题式标题: * 如何使用 Promise 链实现同步执行:简化 `promiseWhile` 和数组缩减技术指南 * S

以下是一些适合所提供文章的问题式标题: * 如何使用 Promise 链实现同步执行:简化 `promiseWhile` 和数组缩减技术指南 * S

Linda Hamilton
Linda Hamilton原创
2024-10-28 11:52:00782浏览

Here are a few question-style titles that fit the provided article:

* How to Achieve Synchronous Execution with Promise Chains: A Guide to Simplified `promiseWhile` and Array Reduction Techniques
* Synchronous Promise Loops Made Easy:  `PromiseWhile` and

如何使用 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn