我正在尝试创建一个函数,该函数从一个对象数组构建一个队列,然后通过调用许多函数来处理每个对象。
处理函数是异步函数,在需要排队之前,我已经使用async/await模式实现了它们。我认为这是必要的,因为每个都依赖于前一个的输出,我不想有一吨嵌套的promise.then。
也就是说,之前我有:
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
我似乎不太明白如何克服这一点。
发布于 2018-02-09 21:55:48
我在async模块中找到了asyncify函数,它允许我这样做:
var queue = async.queue(async.asyncify(async (message, done) => {
let url = await SMSController.getUrl(message.token);
// etc...
}发布于 2018-02-09 19:47:33
你要找的是async.series,不是async.queue
连续运行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])更改为await handleMessage(messages[i], results),然后:
async function handleMessage(message, prevResults) {
// rest of the code
};https://stackoverflow.com/questions/48705043
复制相似问题