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;
})
};
ありがとうございます、これは素晴らしいです! –