【问题标题】:Handling parallel promises using native implementation in Chrome在 Chrome 中使用本机实现处理并行承诺
【发布时间】:2014-01-20 23:12:53
【问题描述】:

Chrome(至少我正在使用的测试版)现在已经在原生 JavaScript 中实现了 Promise,并且基于一些实验,它运行良好。有很多关于“then”和“catch”方法的文档,我可以将 Promise 链接在一起,这样,当一个实现时,下一个就会等待。

但是,我想知道如何并行等待承诺,并在它们全部完成或拒绝时调用回调函数。在这种情况下,所有的结果和原因也必须是可用的,也许在一个数组中。

转储 JavaScript 对象(“Promise”),我看到一个方法“all”,但我找不到它的文档。

谁能提供这方面的信息?

我还实现了自己的实验性并行机制,如下所示:

function async1_promise() {
    return new Promise(
        function(resolve, reject) {
            async_call1(
                function () {
                    resolve("async_call1 worked!");
                }
            );
        }
    );
}

function async2_promise() {
    return new Promise(
        function(resolve, reject) {
            async_call2(
                function () {
                    resolve("async_call2 worked!");
                }
            );
        }
    );
}

function async3_promise() {
    return new Promise(
        function(resolve, reject) {
            async_call3(
                function () {
                    resolve("async_call3 worked!");
                }
            );
        }
    );
}

parallel([async1_promise(), async2_promise(), async3_promise()],
    function (promises, results) {
        console.log('all done', promises, results);
    }
);

function parallel(promises, callback) {
    var results = [];
    promises.forEach(
        function (val, key, array) {
            val.then(
                function (result) {
                    results[key] = {
                        success: true,
                        result: result
                    };
                    if (results.length == promises.length)
                        callback(promises, results);
                },
                function (reason) {
                    results[key] = {
                        success: false,
                        result: reason
                    };
                    if (results.length == promises.length)
                        callback(promises, results);
                }
            );
        }
    );
}

也欢迎对我处理并行承诺的尝试发表评论。

【问题讨论】:

    标签: javascript google-chrome asynchronous


    【解决方案1】:

    Promise.all 接受一组 Promise 实例,并且只有在它们全部解决或一个被拒绝后才会继续。

    一旦所有的承诺都解决了,它会以与传递给Promise.all 相同的顺序为您提供一系列结果,以便您可以访问所有响应, 否则遇到的第一个拒绝将触发catch

    使用您的示例,以下内容可以替换您的 parallel 函数:

    Promise.all([async1_promise(), async2_promise(), async3_promise()])
        .then(function(results) {
            // results = ["async_call1 worked!", "async_call2 worked!", "async_call3 worked!"]          
        })
        .catch(err) {
            // error handling
            // only called once for the first reject encountered
        });
    

    有用的链接

    【讨论】:

    • 谢谢!以上记录在任何地方吗?你是从源代码中得到的吗?您还可以提供其他参考资料吗?
    • 我添加了一些指向规范、来源和使用示例的链接
    • 谢谢!很有帮助的答案。
    • .all 是否并行执行?
    • .all 接受一个可迭代的参数,因此它将遍历内容,而不是做一些神奇的并行:-)
    猜你喜欢
    • 1970-01-01
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    • 2018-09-09
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多