2017-04-19 12 views
1

私が理解しているように、Promise.all()はすべてを並行して実行し、いずれかのPromiseのエラーの最初のエラーでエラーを返します。Promise.all()失敗を許す代替?

私はすべての約束を並行して実行し、そのうちの1つが失敗してもそれらが完了するのを待っていたらどうなりますか?

私は使用するはずのPromiseメソッドまたはモジュールはありますか?

複数のユーザFCMプッシュ通知を並行して送信し、いずれか1つが失敗した場合は.then()キューイングに失敗することは意図していません。これは、結果の配列内nullにエラーが発生したすべてのPromiseオブジェクトを解決します

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

:私は私のコードで

//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

これをやっている

あなたはこのような何かを行うことができます。 を使用してErrorオブジェクトを保持して、最後に失敗を検出したり、{ status, result, error }プロパティを持つオブジェクトに解決したりすることもできます。

+0

ありがとうございます、これは素晴らしいです! –

関連する問題