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

标签 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 () {
    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

如您所见,await 不起作用。我试图 promisify 模块,但问题仍然存在。我尝试使用 d3-queue,我遇到了完全相同的问题。

有什么建议吗?

最佳答案

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

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

您必须 promise 您的功能,这是一个示例:

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 

关于javascript - 等待异步队列进行(异步模块),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52558262/

相关文章:

c# - 替代具有保证交付的 Dataflow BroadcastBlock

javascript - 如何将外部库包含到单元测试中::Angular2-CLI

javascript - Chrome扩展实践中的登录和认证

python - 扭曲的循环调用不调用 errback

javascript - 用于嵌套数据结构处理的递归异步 JavaScript

c# - 为什么等待后 HttpContext.Current 为空?

javascript - Ionic 3 在 IOS 设备中隐藏滚动条

javascript - jQuery 问题(延迟和顺序)

C# UWP 异步绑定(bind)

c# - async-await 是否可以在 C# 之外的其他 .NET 语言中使用?