#promise.all()與promise.race()
Promise.all()方法可以把多個promise實(shí)例 包裝成一個新的promise實(shí)例
Promise.all([ promise1, promise2 ])
: Promise.all()
接收的是一個數(shù)組祈远,數(shù)組中的每一項都是promise實(shí)例呆万,最終返回的也是一個promise實(shí)例。
它分三種情況:
- 如果數(shù)組中的所有實(shí)例都決議為成功的話车份,這時候
promise.all()
就會決議為成功谋减,并且所有這里promise的resolve帶的參數(shù)都會組合成一個數(shù)組傳遞給我們,且順序一一對應(yīng)扫沼。
function getData1() {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('第一條數(shù)據(jù)加載成功');
resolve('data1');
}, 1000);
});
}
function getData2() {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('第二條數(shù)據(jù)加載成功');
resolve('data2');
}, 1000);
});
}
function getData3() {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('第三條數(shù)據(jù)加載成功');
resolve('data3');
}, 1000);
});
}
function getData4() {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('第四條數(shù)據(jù)加載成功');
resolve('data4');
}, 500);
});
}
let p = Promise.all([getData1(),getData2(),getData3(),getData4()]);
//arr 為promise數(shù)組所返回的數(shù)組
p.then(arr => {
console.log(arr);
});
console.log(arr);
結(jié)果為["data1","data2","data3","data4"]
- 當(dāng)數(shù)組中有任意一個promise決議為失敗的時候出爹,那
promise.all()
就會決議為失敗,并且把決議為失敗的promise的錯誤在傳遞過來
例如getData4()是錯誤的:
function getData4() {
return new Promise((resolve, reject) => {
setTimeout(() => {
// console.log('第四條數(shù)據(jù)加載成功');
reject('data4 err');
}, 500);
});
}
let p = Promise.all([getData1(),getData2(),getData3(),getData4()]);
p.then(arr => {
console.log(arr);
}, e => {
console.log(e);
});
這里的promise實(shí)例直接決議為失敗充甚,并且吧getData4中reject傳遞的信息傳遞了回來以政。 console.log(e);打印的就是 ‘data4 err’
。
- 當(dāng)數(shù)組為空
promise.all()
就會決議為成功
let p = Promise.all([]);
p.then(() => {
console.log('dfsafd');
}, e => {
console.log(e);
});
promise.race()
與promise.all對應(yīng)的race方法接收的也是一個數(shù)組伴找,里面也都是promise實(shí)例盈蛮,與all方法不同的是,race里面技矮,只要有一個promise決議為成功或者失敗抖誉,這個promise.race()返回的promise實(shí)例,也會是對應(yīng)的成功或者失敗衰倦,并把值傳遞過來袒炉。
Promise.race([p1, p2, p3])里面哪個結(jié)果獲得的快,就返回哪個結(jié)果樊零,不管結(jié)果本身是成功狀態(tài)還是失敗狀態(tài)
我們把getData1()的定時器改為半秒,
function getData1() {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('第一條數(shù)據(jù)加載失敗');
reject('err');
}, 500);
});
}
function getData2() {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('第二條數(shù)據(jù)加載成功');
resolve('data2');
}, 1000);
});
}
function getData3() {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('第三條數(shù)據(jù)加載成功');
resolve('data3');
}, 1000);
});
}
let p = Promise.race([getData1(),getData2(),getData3()]);
p.then(data => {
console.log(data);
}, e => {
console.log(e);
})
我們會立即輸出err我磁,輸出結(jié)果為
第一條數(shù)據(jù)加載失敗
err
第二條數(shù)據(jù)加載成功
第三條數(shù)據(jù)加載成功
需要注意的是孽文,promise.race()接收空數(shù)組的話,什么反應(yīng)也不會有夺艰。