2017-04-19 42 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

谢谢,这看起来不错! –

相关问题