不談使用場景直接說用法那是耍流氓:
Promise.all
場景:這里舉一個(gè)我工作遇到的案例,需求是使用html2canvas插件(這是一個(gè)截屏js插件言询,異步返回截屏結(jié)果圖片)將一個(gè)頁面若干部分截屏生成圖片假勿,再把這些圖片作為參數(shù)調(diào)用接口生成pdf。這里涉及兩個(gè)點(diǎn),獲取的圖片順序得知道藻懒,然后得等所有圖片都獲取完畢了才能組裝參數(shù)調(diào)用接口,Promise.all完美符合需求视译。
Promise.all用于多個(gè)異步結(jié)果合并到一起嬉荆,且Promise.all獲得的成功結(jié)果的數(shù)組里面的數(shù)據(jù)順序和Promise.all接收到的數(shù)組順序是一致的,注意酷含,如果有任何一個(gè)失敗鄙早,該P(yáng)romise失敗汪茧,返回值是第一個(gè)失敗的子Promise的結(jié)果。
Promise.race
場景:把異步操作和定時(shí)器放到一起限番,如果定時(shí)器先觸發(fā)舱污,認(rèn)為超時(shí),告知用戶弥虐。
Promise.race是哪個(gè)結(jié)果獲得的快扩灯,就返回那個(gè)結(jié)果,不管結(jié)果本身是成功狀態(tài)還是失敗狀態(tài)霜瘪。
上代碼:
let p1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("成功1");
}, 2000);
});
let p2 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("成功2");
}, 5000);
});
let p3 = Promise.reject("失敗");
//Promise.all
Promise.all([p1, p2]).then(
(success) => {
console.log(success);
},
(fail) => {
console.log(fail);
}
);//結(jié)果為:[成功1珠插,成功2]
Promise.all([p1, p2, p3]).then(
(success) => {
console.log(success);
},
(fail) => {
console.log(fail);
}
);//結(jié)果為:失敗
//Promise.race
Promise.race([p1, p2]).then((result) => {
console.log(result);
})
.catch((error) => {
console.log(error);
});//結(jié)果為:成功1