Skip to main content
 首页 » 编程设计

javascript之在 Chrome 中使用 native 实现处理并行 promise

2025年05月04日122zfyouxi

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

但是,我想知道如何并行等待 promise ,并在 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); 
                } 
            ); 
        } 
    ); 
} 

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

请您参考如下方法:

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

一旦所有的 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 
    }); 

有用的链接