promise.all接收一个promise对象的数组作为参数,只有数组里的所有promise状态为rosolve时,才会去调用 .then 方法,它们是并发执行的。
var p1 = Promise.resolve(1),
p2 = Promise.resolve(2),
p3 = Promise.resolve(3);
Promise.all([p1, p2, p3]).then((e) => {
console.log(e);//[1, 2, 3]
});
一旦接收的数组中出现一个promise的reject状态,都不会执行then里的方法,直接执行catch里的方法。
如果元素不是 Promise 对象,则使用Promise.resolve 转成 Promise 对象。
Promise.all([1, 2, 3]).then((e) => {
console.log(e);//[1,2,3]
});
需要明确第一步是判断传参是否为数组,不是则抛出错误;
接下来对每个参数使用Promise.resolve()方法,将现有对象转换为Promise对象,从而控制异步流程,一旦错误,catch到失败;
function promiseAll(promises) {
return new Promise(function (resolve, reject) {
//promises必须是一个数组
if (!(promises instanceof Array)) {
throw new TypeError("promises must be an Array");
}
var len = promises.length,
resolvedCount = 0,
resolvedArray = new Array(len);
for (var i = 0; i < len; i++) {
(function (i) {
Promise.resolve(promises[i])
.then(
(value) => {
resolvedCount++;
resolvedArray[i] = value;
if (resolvedCount == len) {
return resolve(resolvedArray);
}
},
(re) => {
return reject(re);
}
)
.catch((re) => {
console.log(re);
});
})(i);
}
});
}