节点在回调前等待迭代完成
node wait for iteration to complete before callback
我在 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);
}
});
}
改用 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
});
我在 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);
}
});
}
改用 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
});