node.js - Promise.all() 允许失败的替代方案?

标签 node.js ecmascript-6 google-cloud-functions

<分区>

据我了解,Promise.all() 并行执行所有操作,并在任一 Promise 出现错误的第一个实例时返回错误。

现在,如果我想并行运行所有 promise 并等待它们完成,即使其中一个 promise 失败了怎么办?

是否有我应该使用的 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;
    })
};

最佳答案

你可以这样做:

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

这会将所有有错误的 Promise 对象解析为结果数组中的 null。您还可以使用 .catch(error => error) 保留 Error 对象,以在最后检测故障,或解析为具有 { 状态的对象,结果、错误 属性。

关于node.js - Promise.all() 允许失败的替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43503872/

相关文章:

mysql - NodeJS中处理MySQL的嵌套查询回调

node.js - 使用 Redis 和 Nodejs 创建 Restful API

javascript - 提取 - 语法错误 : Unexpected token < in JSON at position 0

javascript - “函数返回未定义的、预期的 promise 或值”,函数只打印日志

kubernetes - 通过谷歌云功能连接集群节点

node.js - 强制 process.exit() 与手动关闭所有打开的资源/套接字

javascript - 使用 forEach 通过 push 方法创建另一个数组,但循环结束后数组为空

javascript - 我无法使用 Gatsby 动态创建页面

Firebase Cloud Functions - 删除时间戳字段超过一个月的条目并每天运行

Node.JS 使用 MD5/ECB 加密并使用 PKCS7 填充