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
});
有用的链接
- https://github.com/domenic/promises-unwrapping - ES6 promise 规范
- V8 Promise source - 参见
PromiseAll实现 - MDN Promise Reference - 不是 Chrome,但使用相同的规范并有使用示例
- html5rocks.com promises tutorial - 包含有关使用
.all 的部分


