Promise.all()方法用于將多個 Promise 實例,包裝成一個新的 Promise 實例。
const p = Promise.all([p1, p2, p3]);
上面代碼中,Promise.all()方法接受一個數(shù)組作為參數(shù),p1、p2、p3都是 Promise 實例,如果不是,就會先調(diào)用下面講到的Promise.resolve方法,將參數(shù)轉(zhuǎn)為 Promise 實例,再進一步處理。另外,Promise.all()方法的參數(shù)可以不是數(shù)組,但必須具有 Iterator 接口,且返回的每個成員都是 Promise 實例。
p的狀態(tài)由p1、p2、p3決定,分成兩種情況。
(1)只有p1、p2、p3的狀態(tài)都變成fulfilled,p的狀態(tài)才會變成fulfilled,此時p1、p2、p3的返回值組成一個數(shù)組,傳遞給p的回調(diào)函數(shù)。
(2)只要p1、p2、p3之中有一個被rejected,p的狀態(tài)就變成rejected,此時第一個被reject的實例的返回值,會傳遞給p的回調(diào)函數(shù)。
下面示例:
1、給各個promise添加catch
let x = 10;
let p1 = new Promise((resolve) => {
resolve("p1 hello" + x);
})
.then((res) => {
console.log(`p1 then 輸出${res}`);
return res;
})
.catch((e) => {
console.log("p1 報錯了");
console.log(e);
});
let p2 = new Promise((resolve) => {
resolve("p2 hello" + x);
})
.then((res) => {
console.log(`p2 then 輸出${res}`);
return res;
})
.catch((e) => {
console.log("p2 報錯了");
console.log(e);
});
let p3 = new Promise((resolve) => {
resolve("p3 hello" + x);
})
.then((res) => {
console.log(`p3 then 輸出${res}`);
return res;
})
.catch((e) => {
console.log("p3 報錯了");
console.log(e);
});
let p4 = new Promise((resolve) => {
resolve("p4 hello" + x);
})
.then((res) => {
console.log(`p4 then 輸出${res}`);
return res;
})
.catch((e) => {
console.log("p4 報錯了");
console.log(e);
});
Promise.all([p1, p2, p3, p4])
.then(result => console.log(result))
.catch((e) => {
console.log("f*cking man 報錯了");
console.log(e);
});
輸出:
2、去掉變量x
,會報異常,各個Promise中的catch捕捉到對應(yīng)的異常, Promise.all中的catch不起效:
// let x = 10;
let p1 = new Promise((resolve) => {
resolve("p1 hello" + x);
})
.then((res) => {
console.log(`p1 then 輸出${res}`);
return res;
})
.catch((e) => {
console.log("p1 報錯了");
console.log(e);
});
let p2 = new Promise((resolve) => {
resolve("p2 hello" + x);
})
.then((res) => {
console.log(`p2 then 輸出${res}`);
return res;
})
.catch((e) => {
console.log("p2 報錯了");
console.log(e);
});
let p3 = new Promise((resolve) => {
resolve("p3 hello" + x);
})
.then((res) => {
console.log(`p3 then 輸出${res}`);
return res;
})
.catch((e) => {
console.log("p3 報錯了");
console.log(e);
});
let p4 = new Promise((resolve) => {
resolve("p4 hello" + x);
})
.then((res) => {
console.log(`p4 then 輸出${res}`);
return res;
})
.catch((e) => {
console.log("p4 報錯了");
console.log(e);
});
Promise.all([p1, p2, p3, p4])
.then(result => console.log(result))
.catch((e) => {
console.log("f*cking man 報錯了");
console.log(e);
});
輸出結(jié)果:文章來源:http://www.zghlxwxcb.cn/news/detail-699590.html
3、去掉各個promise的catch:
// let x = 10;
let p1 = new Promise((resolve) => {
resolve("p1 hello" + x);
})
.then((res) => {
console.log(`p1 then 輸出${res}`);
return res;
});
let p2 = new Promise((resolve) => {
resolve("p2 hello" + x);
})
.then((res) => {
console.log(`p2 then 輸出${res}`);
return res;
});
let p3 = new Promise((resolve) => {
resolve("p3 hello" + x);
})
.then((res) => {
console.log(`p3 then 輸出${res}`);
return res;
});
let p4 = new Promise((resolve) => {
resolve("p4 hello" + x);
})
.then((res) => {
console.log(`p4 then 輸出${res}`);
return res;
});
Promise.all([p1, p2, p3, p4])
.then(result => console.log(result))
.catch((e) => {
console.log("f*cking man 報錯了");
console.log(e);
});
輸出結(jié)果文章來源地址http://www.zghlxwxcb.cn/news/detail-699590.html
到了這里,關(guān)于【ES6】Promise.all用法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!