我正在尝试创建一个函数,该函数从对象数组构建队列,然后通过调用多个函数来处理每个对象。
处理函数是异步函数,在需要排队之前,我使用异步/等待模式实现了这些函数。我认为这是必要的,因为每个都依赖于前一个的输出,并且我不想有大量嵌套的 Promise.then's
即之前我有:
await Promise.all(messages.map(async(message) => {
let activity = await activityController.getActivity(message.activityId);
let url = await SMSController.getUrl(message.Token);
let smsSendResult = await SMSController.sendSMS(messageString, activity.mobileNo);
// etc...
}
现在我想要做的是:
let queue = async.queue((message, done) => {
let activity = await activityController.getActivity(message.activityId);
let smsSendResult = await SMSController.sendSMS(messageString, activity.mobileNo);
// etc...
}
messages.forEach((message) => {
queue.push(message);
})
我有问题,但这会导致
SyntaxError: await is only valid in async function
我似乎不太明白如何克服这个问题。
您正在寻找async.series
, not async.queue
:
series(tasks, callbackopt) https://caolan.github.io/async/docs.html#series
运行中的函数tasks
一系列的集合,每个集合在前一个函数完成后运行。
所以只需遵循文档即可:
const messageCallbacks = messages.map(function(msg) {
return async function(callback) {callback(await handleMessage(msg));
});
async.series(messageCallbacks,
// optional callback
function(err, results) {
// results is now equal to whatever handleMessage resolves to
});
没有异步:
async function asyncMessageQueue(messages) {
const results = [];
for(var i=0,l=messages.length; i<l; ++i) {
results.push(await handleMessage(messages[i]));
}
return results;
}
async function handleMessage(message) {
let activity = await activityController.getActivity(message.activityId);
let url = await SMSController.getUrl(message.Token);
let smsSendResult = await SMSController.sendSMS(messageString, activity.mobileNo);
// rest of the code
};
这还允许您提供带有任何先前结果的下一条消息:只需更改await handleMessage(messages[i])
to await handleMessage(messages[i], results)
进而:
async function handleMessage(message, prevResults) {
// rest of the code
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)