正确等待的承诺承诺是否被拒绝

时间:2019-05-24 19:28:01

标签: node.js web-push

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

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));
    }

}

主要问题是sendNotifications函数中的webPush.sendNotification。 webPush.sendNotification返回一个promise,如果成功或失败,则返回相同的对象。主要区别在于返回的对象内部的错误代码与http代码类似。 如果返回的代码等于410,则下次不必重新发送通知。

这部分是无用的,因为webPush.sendNotification是异步的

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

我尝试使用Promise.all尤其是“最终”功能而没有成功。

如何正确处理呢?

1 个答案:

答案 0 :(得分:0)

好吧

文件中有一个订户列表。 您首先要加载它。 然后,您将通知异步发送给所有订户。 如果订户发送代码411,则从内存和文件中的列表中删除该订户。

可以吗?

使用promise.all是个好方法,因此您必须构建一个返回promise的函数数组,以提供promise.all。那么您可以等待它以正确检查某些呼叫是否失败,这意味着您需要重写磁盘上的用户列表。

所以:

  • 在单独的方法“ notify”中移动for循环内容,使用参数“ subid”并返回sendNotification()。then.catch的结果
  • 使用Feature

由于您返回了catch的结果,因此从sendNotification拒绝不会停止对promise的等待。全部

相关问题