节点等待迭代完成后再回调

时间:2018-08-27 09:41:46

标签: node.js parallel-processing aws-lambda iteration async.js

我在node.js中有一个lambda函数来发送推送通知。

在该函数中,我需要遍历我的用户,在回调之前为每个用户发送一个通知。

理想情况下,我希望迭代可以并行执行。

什么是最好的方法?

我的代码当前如下,但由于最后一个用户并非总是要处理的最后一个,因此它无法按预期工作:

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 :(得分:1)

改为使用Promise.all-将每个user的关联apnProvider.send调用映射到数组中的Promise,以及将数组中的所有Promise映射到解决后,调用回调:

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
  });