JS ждут окончания итерации курсора мангуста - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь получить большие данные из mongodb

Есть мой код

    let cont = 0
    const stream = await dataModel.find({}).lean().cursor(); // it will return around 2.000 elements
    console.log("Checkpoint one")

    await stream.on('data', async (res) => {
       try {

         cont += 1


       } catch (e) {
         console.log(e)
       }
    });

    await stream.on('close', () => {
      console.log(`Execution ended. Number of elements: ${cont}.`);
    });

    console.log("Checkpoint two")

Вывод:

Checkpoint one
Checkpoint two
Execution ended. Number of elements: 2194.

Ожидаемый вывод:

Checkpoint one
Execution ended. Number of elements: 2194.
Checkpoint two

Когда я пытаюсь консоль записывать в журнал каждый res внутри функции «on data», она также записывает консоль после «Контрольной точки два»,

1 Ответ

0 голосов
/ 20 декабря 2018

javascript stream.on('close', () => { console.log(`Execution ended. Number of elements: ${cont}.`); }); Это ОПРЕДЕЛЯЕТ (а не «выполняет») функцию (которая вызывается каждый раз, когда поток закрывается), а затем напрямую переходит к выполнению кода.Вы не можете await это, вы также не можете await stream.on('data'), потому что это та же проблема.Если вы хотите, чтобы ваша родительская функция ожидала точки, в которой поток завершил чтение, вы можете создать new Promise, который будет заполнен вашей stream.on('close') функцией.Затем вы можете await это обещание как раз перед вашим console.log("Checkpoint two").Это должно сработать, возможно, вы захотите попробовать.

...