首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有异步/等待样式功能的async.queue

具有异步/等待样式功能的async.queue
EN

Stack Overflow用户
提问于 2018-02-09 19:42:11
回答 2查看 3.3K关注 0票数 5

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

处理函数是异步函数,在需要排队之前,我已经使用async/await模式实现了它们。我认为这是必要的,因为每个都依赖于前一个的输出,我不想有一吨嵌套的promise.then。

也就是说,之前我有:

代码语言:javascript
复制
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...
}

现在我想要做的是:

代码语言:javascript
复制
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

我似乎不太明白如何克服这一点。

EN

Stack Overflow用户

发布于 2018-02-09 19:47:33

你要找的是async.series,不是async.queue

series(tasks, callbackopt)

连续运行tasks集合中的函数,每个函数在前一个函数完成后运行。

因此,只需遵循文档:

代码语言:javascript
复制
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
});

如果不使用异步:

代码语言:javascript
复制
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),然后:

代码语言:javascript
复制
async function handleMessage(message, prevResults) {
        // rest of the code
};
票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48705043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档