模拟实现 Promise.all 方法
function myall(proArr) {
// 返回一个promise实例
return new Promise((resolve, reject) => {
// 判断参数是否是数组
if (!Array.isArray(proArr)) {
return reject(new TypeError('arguments must be Array'))
}
let count = 0
let newValues = new Array(proArr.length) // 接收新的结果参数 建立一个伪数组
for (let i = 0; i < proArr.length; i++) {
// 运用promise特性 只会有一个状态
Promise.resolve(proArr[i]).then(res => {
count++
newValues[i] = res // 把每次返回成功的数据添加到数组中
if (count === proArr.length) { // 数据接收完成
return resolve(newValues)
}
}, rej => reject(rej))
}
})
}
模拟实现 Promise.race 方法
同样接受一个数组作为参数。只要p1
、p2
、p3
之中有一个实例的状态先发生改变,p
的状态就跟着改变。并把第一个改变状态的 Promise 实例的返回值,传递给p
的回调函数。
function myrace(proArr) {
return new Promise((resolve, reject) => {
for (let i = 0; i < proArr.length; i++) {
proArr[i].then(resolve, reject);
}
})
}
Promise.all
Promise.all
接收一个 promise
对象的数组作为参数,当这个数组里的所有 promise
对象全部变为resolve
或 有 reject
状态出现的时候,它才会去调用 .then
方法,它们是并发执行的。
var p1 = Promise.resolve(1),
var p2 = Promise.resolve(2),
var p3 = Promise.resolve(3);
Promise.all([p1, p2, p3]).then(function (results) {
console.log(results); // [1, 2, 3]
});
在上面的方法中,promise
数组中所有的 promise
实例都变为resolve
的时候,该方法才会返回,并将所有结果传递 results
数组中。
promise
数组中任何一个 promise
为 reject
的话,则整个 Promise.all
调用会立即终止,并返回一个 reject
的新的 promise
对象。reject
使用示例如下:
var p1 = Promise.resolve(1),
var p2 = Promise.reject(2),
var p3 = Promise.resolve(3);
Promise.all([p1, p2, p3]).then(function (results) {
//then方法不会被执行
console.log(results);
}).catch(function (e){
//catch方法将会被执行,输出结果为:2
console.log(e);
});
总结 promise.all 的特点
1、接收一个 Promise
实例的数组或具有 Iterator
接口的对象,
2、如果元素不是 Promise
对象,则使用 Promise.resolve
转成 Promise
对象
3、如果全部成功,状态变为 resolved
,返回值将组成一个数组传给回调
4、只要有一个失败,状态就变为 rejected
,返回值将直接传递给回调 all()
的返回值也是新的 Promise
对象