Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 带有异步/等待样式函数的async.queue_Javascript_Async Await_Queue - Fatal编程技术网

Javascript 带有异步/等待样式函数的async.queue

Javascript 带有异步/等待样式函数的async.queue,javascript,async-await,queue,Javascript,Async Await,Queue,我试图创建一个函数,该函数从一个对象数组构建一个队列,然后通过调用多个函数来处理每个对象 处理函数是异步函数,在需要排队之前,我使用异步/等待模式实现了这些函数。我认为这是必要的,因为每一个都依赖于前一个的输出,我不想有一吨嵌套的承诺 i、 e.以前我有: await Promise.all(messages.map(async(message) => { let activity = await activityController.getActivity(message.act

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

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

i、 e.以前我有:

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仅在异步函数中有效


我似乎不太明白如何克服这个问题。

您要找的是
async.series
,而不是
async.queue

依次运行
任务
集合中的函数,每个函数在上一个函数完成后运行

因此,只需遵循以下文档:

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

我在async模块中找到了asyncify函数,它允许我执行以下操作:

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

谢谢我认为这并不是我所需要的。我应该说,我使用的是async.queue(),这样我就可以使用可配置的并发性,并在队列为空时使用queue.drain()得到通知。消息也来自其他地方(数据库),需要放入队列中的每个消息,我用
async.series
solution更新了答案。我不知道你们所说的来自数据库的消息是什么意思。试试看
var queue = async.queue(async.asyncify(async (message, done) => {
    let url = await SMSController.getUrl(message.token);
    // etc...
}