如何在循环中以正确的方式使用生成器

How to use generators in a proper way with loops

假设我们在数组中有一些数据,我们需要将每个数组项保存在 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`);
});

我预计 'the end' 将在所有数据保存后输出,控制台将如下所示:

0
1
2
3
xxx
The end. Do here some cool things

但我得到的是:

0
1
2
xxx
The end. Do here some cool things
3

如何将代码修复为:
1. 保存所有项目
后使代码输出xxx 2. 让代码真正在最后输出 The end...

?

这是否解决了您的问题? 变化

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

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

基本上,由于您要做出承诺,我的狡猾感觉想知道它的顺序是如何工作的。通过使用 .then,您可以保证生成器在 console.log 完成之前不会产生。