2017-04-19 80 views
1

據我瞭解,Promise.all()並行執行所有操作,並在任何Promise中的第一個錯誤實例中返回一個錯誤。Promise.all()替代,允許失敗?

現在如果我想並行運行所有承諾並等待它們完成,即使其中一個承諾失敗,該怎麼辦?

是否有Promise方法或模塊,我應該使用?

我發送了一堆用戶FCM推送通知並行和失敗.then()排隊如果他們中的任何一個失敗是不打算。

我在我的代碼這樣做

//then chain 

    .then(()=>{ 
      let startChatPromises = []; 
      for (let i = 0 ; i < queue_length ; i ++){ 
       startChatPromises.push(matchUsers(some_key,some_key)); 
      } 
      return Promise.all(startChatPromises); 
     }).then(()=>{// Continue processing even after failure ?}); 


let matchUsers = (room_id,...user_ids) => { 

    let chat_key = admin.database().ref().child("chats").child(room_id).push().key; 

    let participants = {}; 

    user_ids.forEach(user_id=> { 
     participants[`${user_id}`] = true; 
    }); 

    return admin.database().ref().child("chats").child(room_id).child(chat_key).update({ 
     "last_message_ts" : new Date().getTime(), 
     "participants" : participants 
    }).then(()=>{ 
     //Get Users 
     let getFCMTokenPromises = []; 
     user_ids.forEach(user_id => { 
      getFCMTokenPromises.push(admin.database().ref("users").child(user_id).child("fcm_id").once('value')); 
     }); 
     return Promise.all(getFCMTokenPromises); 
    }).then(results => { 
     // Send Push Notifications 
     let tokens = []; 
     results.forEach(snapshot=>{ 
      if (snapshot.val() !== undefined && snapshot.val() !== null && snapshot.val() !== "") 
       tokens.push(snapshot.val()); 
     }); 
     const payload = { 
      data: { 
       NOTIFICATION_TYPE: 'START_CHAT', 
       CHAT_UID: chat_key 
      } 
     }; 
     return admin.messaging().sendToDevice(tokens, payload); 
    }).catch(()=>{ 
     return true; 
    }) 
}; 

回答

4

你可以做這樣的事情:

function allSkippingErrors(promises) { 
    return Promise.all(
    promises.map(p => p.catch(error => null)) 
) 
} 

這將所有Promise對象有錯誤解析爲null結果數組英寸您還可以使用.catch(error => error)保留Error對象,以最終檢測故障,或者解析爲具有{ status, result, error }屬性的對象。

+0

謝謝,這看起來不錯! –

相關問題