Ожидание обработки асинхронной очереди (модуль асинхронности) - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь построить очередь с помощью 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

Как видите, ожидание не работает.Я попытался обещать модуль, но проблема все еще здесь.Я попытался с d3-очереди, и у меня была точно такая же проблема.

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Как сказал @ Chiến Nghê, вы используете некоторую асинхронность / ожидание, когда в этом нет необходимости, но это другая проблема.

Ваше ожидание не работает в конце, потому что ваша функция стока вызывается наконец вашей очереди, и он не возвращает обещание.

Вы должны обещать свою функцию, вот пример, чтобы сделать это:

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 
0 голосов
/ 01 октября 2018

Ваша программа работает как есть.На самом деле вам не нужно объявлять async для функции run().Эта функция просто помещает 30 асинхронных задач в очередь для последующего выполнения, после чего она заканчивается.

Я не знаю точно, что вы хотите, но если вы хотите, логика console.log('END') выполняется только каждыйасинхронные задачи в очереди завершены.Пожалуйста, переместите его в функцию drain() очереди.

...