Как правильно использовать генераторы с циклами

Допустим, у нас есть некоторые данные в массиве, и нам нужно сохранить каждый элемент массива в отдельном документе в mongodb

Вот код, как мне это сделать:

const co = require('co');

const Model = new require('./mongoose').Schema({...});

const data = [
    {...},
    {...},
    {...},
    {...}
];

function* saveData() {
    for (let i = 0; i < data.length; i++) {
        yield (new Model(data[i])).save(() => {
            console.log(i);
        });
    }

    yield function*() { console.log(`xxx`); };
}

co(saveData).then(() => {
    console.log(`The end. Do here some cool things`);
});

Я ожидаю, что "конец" будет выдан после того, как все сохраненные данные и консоль будут выглядеть так:

0
1
2
3
ххх
Конец. Делай здесь некоторые классные вещи

Но то, что я получаю, это:

0
1
2
ххх
Конец. Делай здесь некоторые классные вещи
3

Как исправить код на:
1. сделать код для вывода xxx после сохранения всех предметов
2. сделать код для вывода The end... действительно в конце

?

1 ответ

Решение

Это решает вашу проблему? + Изменить

yield (new Model(data[i])).save(() => {
            console.log(i);
        });

к

yield (new Model(data[i])).save().then(() => console.log(i));

По сути, так как вы даете обещание, мое чувство пауков интересует, как устроен этот порядок. Используя.then, вы гарантируете, что генератор не будет работать, пока не будет завершен файл console.log.

Другие вопросы по тегам