Promise.all 如何防止某一個promise失敗而使整個promise失敗


原理:

  由於Promise內部實現中,是否resolve由內部成功數組的長度和傳入數組的長度進行比較的,那么在給失敗的Promise在catch的時候返回一個reolve狀態就可以啦。

上代碼:

  正常失敗情況:

let p1 = new Promise((resolve, reject) => { 
    setTimeout(resolve, 1000, 'one'); 
}); 
let p2 = new Promise((resolve, reject) => { 
    setTimeout(resolve, 2000, 'two'); 
});
let p3 = new Promise((resolve, reject) => {
    setTimeout(resolve, 3000, 'three');
});
let p4 = new Promise((resolve, reject) => {
    setTimeout(resolve, 4000, 'four');
});
let p5 = new Promise((resolve, reject) => {
    reject('錯誤');
})
  
Promise.all([p1, p2, p3, p4, p5]).then(values => { 
    console.log({values});
}, reason => {
    console.log({reason});// reject
});

 

 

  處理后:

 

let p1 = new Promise((resolve, reject) => {
setTimeout(resolve, 1000, 'one');
});
let p2 = new Promise((resolve, reject) => {
setTimeout(resolve, 2000, 'two');
});
let p3 = new Promise((resolve, reject) => {
setTimeout(resolve, 3000, 'three');
});
let p4 = new Promise((resolve, reject) => {
setTimeout(resolve, 4000, 'four');
});
let p5 = new Promise((resolve, reject) => {
reject('錯誤');
})

function catchFun(items) {
  return items.map(item => item.catch((err) => Promise.resolve(err)))
}


Promise.all(catchFun([p1, p2, p3, p4, p5])).then(values => {
  console.log({values});
}, reason => {
  console.log({reason}); // reject
});

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM