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

Await for an async queue to be proceeded (async module)

我正在尝试使用 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
// logs from delayedLog
END 

输出:

START
END 
// logs from delayedLog

如您所见,等待无法正常工作。我试图 promisify 模块,但问题仍然存在。我尝试使用 d3-queue,我遇到了完全相同的问题。

有什么建议吗?

您的程序按原样运行。实际上你不需要为函数 run() 声明 async。这个函数就是简单的把30个async task放到队列中等待执行然后结束

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

正如@Chiến Nghê 所说,您正在使用一些不需要的 async/await,但这是另一个问题。

你的 await 在最后没有工作,因为你的 drain 函数在你的队列末尾被调用并且它没有返回承诺。

你必须承诺你的功能,这里有一个示例:

function end() {
    return new Promise((resolve, reject) => {
        myQueue.drain = function () {
            console.log('The queue is now empty.');
            resolve();
        };
    })
}

然后您可以在结束函数上使用异步等待:

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

输出:

START
// a lot of logs
END