Promise.all()对象方法
接收一个promise对象数组作为参数,只有当所有的promise的状态变为resolve或者reject时,才会去触发then()回掉函数,并且他们都是并发执行的。
var p1=Promise.resolve(1)
p2=Promise.resolve(2)
p3=Promise.resolve(3)
Promise.all([p1,p2,p3]).then(function(reslove){
console.log(reslove) //[1,2,3]
})
上述只是执行了当所有的promise返回的状态都是resolve时的情况,如果当其中一个promise返回的是reject,那么整个Promise.all()调用就会结束,并且返回的是当前reject的promise结果。
var p1=Promise.resolve(1)
p2=Promise.resolve(2)
p3=Promise.reject(3)
Promise.all([p1,p2,p3]).then(function(reslove){
console.log(reslove) //没有任何输出,并且不会被执行
}).catch(function(err){
console.log(err) //3
})
总结一下Promise.all的特点
- 首先是对象上的方法,不能通过实例来调用该方法。
- 接收参数是数组形式的promise对象
- 只有所有的promise返回的状态都是reslove时才会执行成功的回掉,返回值是以数组的形式传递。否则就会返回状态是reject的promise对象,返回值是一个reject状态的promise对象
Promise.all()实现
function promiseAll(promises) {
return new Promise(function(resolve, reject) {
if (!Array.isArray(promises)) {
return reject(new TypeError('arguments must be an array'));
}
var resolvedCounter = 0;
var promiseNum = promises.length;
var resolvedValues = new Array(promiseNum);
for (var i = 0; i < promiseNum; i++) {
(function(i) {
Promise.resolve(promises[i]).then(function(value) {
resolvedCounter++
resolvedValues[i] = value
if (resolvedCounter == promiseNum) {
return resolve(resolvedValues)
}
}, function(reason) {
return reject(reason)
})
})(i)
}
})
}