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);
}
);
}
);
}
我对欢迎处理并行承诺的评论也很受欢迎。
答案 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
});
有用的链接
PromiseAll
了解实施情况.all