使用Chrome中的本机实现处理并行承诺

时间:2014-01-20 23:12:53

标签: javascript google-chrome asynchronous

Chrome(至少我正在使用的测试版)现在已经在本机JavaScript中实现了承诺,并且基于一些实验,它的工作正常。有很多关于“then”和“catch”方法的文档,我可以将promises链接在一起,这样当一个完成时,下一个就会等待。

但是,我想知道如何并行地等待promises,当它们全部满足或拒绝时调用回调函数。在这种情况下,所有结果和原因也必须可用,也许在阵列中。

转储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);
                }
            );
        }
    );
}

我对欢迎处理并行承诺的评论也很受欢迎。

1 个答案:

答案 0 :(得分:8)

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
    });

有用的链接