Как правильно использовать генераторы с циклами
Допустим, у нас есть некоторые данные в массиве, и нам нужно сохранить каждый элемент массива в отдельном документе в 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.