簡體   English   中英

等待異步隊列繼續處理(異步模塊)

[英]Await for an async queue to be proceeded (async module)

我正在嘗試使用nodejs和async模塊構建隊列,但是無法按需工作。

這是我的代碼:

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

如您所見,等待不起作用。 我試圖使模塊分散,但問題仍然存在。 我嘗試使用d3隊列,但遇到了完全相同的問題。

有什么建議嗎?

您的程序按原樣工作。 實際上,您不需要為函數run()聲明async 此功能僅是將30個異步任務放入隊列中以供以后執行,然后在此之后結束。

我不知道確切想要什么,但是如果要執行console.log('END')邏輯,則僅完成隊列中的每個異步任務。 請將其移至隊列的drain()函數。

正如@ChiếnNghê所說,您正在使用一些不需要等待的async / await,但這是另一個問題。

您的等待未在最后完成,因為您的排水功能在隊列的末尾被調用,並且未返回承諾。

您必須保證您的功能,這是一個示例示例:

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

然后您可以在end函數上使用異步等待:

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

輸出:

START
// a lot of logs
END 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM