如何在循环中以正确的方式使用生成器
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 完成之前不会产生。
假设我们在数组中有一些数据,我们需要将每个数组项保存在 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 完成之前不会产生。