带有async / await样式函数的async.queue

时间:2018-02-09 11:42:11

标签: javascript async-await queue

我试图创建一个从对象数组构建队列的函数,然后通过调用许多函数来处理每个对象。

处理函数是异步函数,在需要排队之前,我使用async / await模式实现。我认为这是必要的,因为每个都依赖于前一个的输出,我不想有一吨嵌套的承诺。然后

即。以前我曾经:

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

我似乎无法理解如何克服这个问题。

2 个答案:

答案 0 :(得分:0)

您正在寻找async.series,而不是async.queue

  

series(tasks, callbackopt)

     

运行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
};

答案 1 :(得分:0)

我在异步模块中找到了asyncify函数,允许我这样做:

var queue = async.queue(async.asyncify(async (message, done) => {
    let url = await SMSController.getUrl(message.token);
    // etc...
}