узел ожидает завершения итерации до обратного вызова - PullRequest
0 голосов
/ 27 августа 2018

У меня есть лямбда-функция в node.js для отправки push-уведомления.

В этой функции мне нужно пройти через моих пользователей, отправляя уведомление для каждого из них перед обратным вызовом.

В идеале я бы хотел, чтобы итерация выполнялась параллельно.

Как лучше всего это сделать?

Мой код в настоящее время выглядит следующим образом, но он не работает должным образом, поскольку последний пользователь не всегда обрабатывается последним:

var apnProvider = new apn.Provider(options);

var iterationComplete = false;

for (var j = 0; j < users.length; j++) {
    if (j === (users.length - 1)) {
        iterationComplete = true;
    }

    var deviceToken = users[j].user_device_token;
    var deviceBadge = users[j].user_badge_count;

    var notification = new apn.Notification();

    notification.alert = message;

    notification.contentAvailable = 1;

    notification.topic = "com.example.Example";

    apnProvider.send(notification, [deviceToken]).then((response) => {

        if (iterationComplete) {
            context.succeed(event);
        }
    });
}

1 Ответ

0 голосов
/ 27 августа 2018

Вместо этого используйте Promise.all - сопоставьте каждый apnProvider.send связанный вызов *1003* с Promise в массиве, и когда все Promise s в массиве разрешены, вызовите обратный вызов:

const apnProvider = new apn.Provider(options);
const userPromises = users.map((user) => {
  const deviceToken = user.user_device_token;
  const deviceBadge = user.user_badge_count;
  const notification = new apn.Notification();
  notification.alert = message;
  notification.contentAvailable = 1;
  notification.topic = "com.example.Example";
  return apnProvider.send(notification, [deviceToken]);
})
Promise.all(userPromises)
  .then(() => {
    context.succeed(event);
  })
  .catch(() => {
    // handle errors
  });
...