我尝试制作一个简单的网站,以发送一些推送通知。 这是代码的一部分:
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尤其是“最终”功能而没有成功。
如何正确处理呢?
答案 0 :(得分:0)
好吧
文件中有一个订户列表。 您首先要加载它。 然后,您将通知异步发送给所有订户。 如果订户发送代码411,则从内存和文件中的列表中删除该订户。
可以吗?
使用promise.all是个好方法,因此您必须构建一个返回promise的函数数组,以提供promise.all。那么您可以等待它以正确检查某些呼叫是否失败,这意味着您需要重写磁盘上的用户列表。
所以:
Feature
由于您返回了catch的结果,因此从sendNotification拒绝不会停止对promise的等待。全部