我试着做一个简单的网站,发送一些推送通知。下面是代码的一部分:
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的异步性,这部分是无用的。
if(subscriber_deleted==1)
{
setSubscribers(JSON.stringify(subscribers));
}
我试图使用Promise.all,特别是“最终”函数,但没有成功。
如何妥善处理这件事?
发布于 2019-05-24 12:20:40
好的,
你在一个文件里有一个被征服者的名单。你从装货开始。然后,以异步方式向所有订阅者发送通知。如果被征服者发送代码411,您可以在内存和文件中将其从列表中删除。
这样可以吗?
使用promise.all是一种很好的方法,因此您必须构建一个返回承诺的函数数组,以满足promise.all的需求。然后,您可以等待它来正确地检查某个调用是否失败,这意味着您需要在磁盘上重写suscriber列表。
所以:
await promise.all(suscribers.keys().map(notify))
由于您返回了catch的结果,所以拒绝sendNotification不会停止等待promise.all
https://stackoverflow.com/questions/56298575
复制相似问题