Javascript 等待进行异步队列(异步模块)

Javascript 等待进行异步队列(异步模块),javascript,asynchronous,async-await,queue,async.js,Javascript,Asynchronous,Async Await,Queue,Async.js,我试图用nodejs和异步模块构建一个队列,但它并没有按预期工作 这是我的密码: const async = require('async'); const queueSize = 10; const taskHandler = function (task, done) { task(done); }; const myQueue = async.queue(taskHandler, queueSize); myQueue.drain = function () { co

我试图用nodejs和异步模块构建一个队列,但它并没有按预期工作

这是我的密码:

const async = require('async');

const queueSize = 10;
const taskHandler = function (task, done) {
    task(done);
};

const myQueue = async.queue(taskHandler, queueSize);

myQueue.drain = function () {
    console.log('The queue is now empty.');
};

function delay() {
    return new Promise(resolve => setTimeout(resolve, 1000));
}

async function delayedLog(item) {
    await delay();
    console.log(item);
}

const run = async () => {
    for (let item = 0; item < 30; item++) {
        myQueue.push(async function (done) {
            await delayedLog(item)
            done();
        });
    }
}

(async () => {
    console.log('START');
    await run();
    console.log('END);
})()
输出:

START
END 
// logs from delayedLog
START
// a lot of logs
END 
正如你所看到的,等待不起作用。我试着提出模块,但问题仍然存在。我尝试使用d3队列,但遇到了完全相同的问题


有什么建议吗?

您的程序正在按原样运行。实际上,对于函数
run()
,不需要声明
async
。此函数只是将30个异步任务放入队列,以便稍后执行,然后结束


我不知道您想要什么,但如果您想要执行
console.log('END')
逻辑,则只有队列中的每个异步任务都完成了。请将其移动到队列的
drain()
函数。

As@Chiến Nghê说您正在使用一些不需要的异步/等待,但这是另一个问题

您的等待在最后不起作用,因为您的drain函数在队列末尾被调用,并且它没有返回承诺

您必须说明您的函数,下面是一个示例:

function end() {
    return new Promise((resolve, reject) => {
        myQueue.drain = function () {
            console.log('The queue is now empty.');
            resolve();
        };
    })
}
然后,您可以使用端函数上的async Wait:

(async () => {
    console.log('START');
    run();
    await end();
    console.log('END');
})()
输出:

START
END 
// logs from delayedLog
START
// a lot of logs
END 

这样做的目的是等待队列的末尾处理其他内容,真正的代码启动会多次发送到服务器,我需要等待所有的响应,以便在数据库中插入数据,然后再使用其他数据(async()=>{console.log('START');wait run(process1);wait run(process1);console.log('end);})对不起,我按enter键的次数太多了最终目的是这样的main(async()=>{console.log('START');wait run(process1);wait saveToDB(responses1);wait run(process2);wait saveToDB(responses2);wait run(process3);wait saveToDB(responses3);console.log('END);})()我的意见是您将“其他内容”放入queue drain()函数。因为一旦您将任务注册到异步队列,除了drain()之外,没有其他地方可以作为结束队列事件检测点。这就是这个drain()函数存在的原因!排水是唯一的方法,所以我按照@Curse所说的做了,我承诺了它,并在主流程中等待它,这样我就可以以一种干净的方式链接多个任务(当然这是更大项目的一部分,所以我不能将代码直接保留在排水函数中),感谢bothbtw关于无需异步/等待的建议