正确等待一系列承诺被拒绝

Properly waiting array of promises rejected or not

我尝试制作一个发送一些推送通知的简单网站。 这是代码的一部分:

function getSubscribers() {
    var subscribers = {};
    try {
        var subscribersRaw = fs.readFileSync(SUBSCRIBERS_PATH);
        subscribers = JSON.parse(subscribersRaw);
    } catch (err) {}
    return subscribers;
}


function setSubscribers(data) {
    fs.writeFileSync(SUBSCRIBERS_PATH, data);
}


function sendNotifications(req, res) {
    var message = "message";
    var icon = "icon.png"
    var subscribers = getSubscribers();

    var subscriber_deleted = 0;

    for (var subid in subscribers) {
        const subscription = subscribers[subid];
        const payload = {
            message: message,
            icon : icon
        };
        const options = {
            TTL: 3600
        };
        webPush.sendNotification(subscription, JSON.stringify(payload), options)
            .then(function() {})
            .catch(function(error) {
                console.log(error);
                if (error.statusCode === 410) {
                    delete subscribers[subid];
                    subscriber_deleted = 1;
                }
            });
    }

    if(subscriber_deleted==1)
    {
        setSubscribers(JSON.stringify(subscribers));
    }

}

主要问题是 webPush.sendNotification 在 sendNotifications 函数中。 webPush.sendNotification return 一个承诺 return 相同的对象,无论成功还是失败。主要区别在于对象 returned 中的错误代码类似于 http 代码。 如果代码return等于410,则需要下次不要重发通知。

由于 webPush.sendNotification

的异步特性,这部分无用
if(subscriber_deleted==1)
{
    setSubscribers(JSON.stringify(subscribers));
}

我尝试使用 Promise.all 尤其是 'finally' 函数但没有成功。

如何正确处理?

好的,

您在文件中有订阅者列表。 您首先加载它。 然后您异步向所有订阅者发送通知。 如果订阅者发送代码 411,您将从列表中删除该订阅者,包括内存和文件。

可以吗?

使用 promise.all 是个好方法,因此您必须构建一个函数数组 return 并承诺 promise.all。然后你可以等待它正确检查是否有一些调用失败意味着你需要重写磁盘上的订阅者列表。

所以:

  • 在单独的方法中移动 for 循环内容 "notify",采用参数 "subid" 并 returning sendNotification() 的结果。then.catch
  • 使用await promise.all(suscribers.keys().map(notify))

既然你return catch 的结果,拒绝 sendNotification 不会停止等待 promise.all