首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >正确等待一系列承诺是否被拒绝

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

Stack Overflow用户
提问于 2019-05-24 19:28:00
回答 1查看 191关注 0票数 0

我试着做一个简单的网站,发送一些推送通知。下面是代码的一部分:

代码语言:javascript
运行
复制
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返回一个承诺,该承诺在成功或失败时返回相同的对象。主要的区别是返回对象内部的错误代码,类似于http代码。如果代码返回等于410,则有必要下次不重新发送通知。

由于webPush.sendNotification的异步性,这部分是无用的。

代码语言:javascript
运行
复制
if(subscriber_deleted==1)
{
    setSubscribers(JSON.stringify(subscribers));
}

我试图使用Promise.all,特别是“最终”函数,但没有成功。

如何妥善处理这件事?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-24 20:20:40

好的,

你在一个文件里有一个被征服者的名单。你从装货开始。然后,以异步方式向所有订阅者发送通知。如果被征服者发送代码411,您可以在内存和文件中将其从列表中删除。

这样可以吗?

使用promise.all是一种很好的方法,因此您必须构建一个返回承诺的函数数组,以满足promise.all的需求。然后,您可以等待它来正确地检查某个调用是否失败,这意味着您需要在磁盘上重写suscriber列表。

所以:

  • 移动分隔方法“sendNotification”中的for循环内容,接受参数"subid“并返回sendNotification().then.catch的结果
  • 使用await promise.all(suscribers.keys().map(notify))

由于您返回了catch的结果,所以拒绝sendNotification不会停止等待promise.all

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56298575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档