Правильно ожидающий массив обещаний отклонен или нет - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь сделать простой веб-сайт, который отправляет некоторые 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));
    }

}

Основная проблема - webPush.sendNotification в функции sendNotifications.webPush.sendNotification возвращает обещание, которое возвращает тот же объект в случае успеха или неудачи.Основным отличием является код ошибки внутри возвращаемого объекта, который похож на код http.Если код возврата равен 410, необходимо не отправлять уведомление в следующий раз.

Эта часть бесполезна из-за асинхронного свойства webPush.sendNotification

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

Я пытался использовать Promise.all, особенно функцию 'finally', но безуспешно.

Какправильно с этим справиться?

1 Ответ

0 голосов
/ 24 мая 2019

ОК,

У вас есть список подписчиков в файле.Вы начинаете с загрузки.Затем вы отправляете уведомления всем подписчикам асинхронно.Если подписчик отправляет код 411, вы удаляете этого подписчика из списка, как в памяти, так и в файле.

Все в порядке?

Использование promise.all - хороший способ, поэтому выдолжен создать массив функций, возвращающих обещание, чтобы прокормить обещание. все.затем вы можете подождать, пока он не проверит должным образом, произошел ли сбой какого-либо вызова, то есть вам нужно переписать список подписчиков на диске.

Итак:

  • Переместить содержимое цикла в отдельный метод "notify", принимая параметр" subid "и возвращая результат sendNotification (). then.catch
  • Использование await promise.all(suscribers.keys().map(notify))

Поскольку вы возвращаете результат catch, отклоните sendNotificationне остановит ожидание обещания. все

...