刚开始学,很多原理的东西不是很了解,请大家帮帮忙。
如下代码:
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
var counter = 1;
var Cat = mongoose.model('Cat', {
name: String
});
var kitty = new Cat({
name: 'Zildjian'
});
for (i = 1; i < 1000; i++) {
console.log("loop start");
kitty.save(function(err) {
console.log("saved " + counter++);
if (err) // ...
console.log('meow');
});
console.log("loop end");
}
在我的预期中,循环在跑的过程中会有数据插入到数据库,但是事实并非如此。要等到循环结束,才开始有数据插入。我觉着即使循环是一个cpu密集操作,有可能会阻塞回调函数的执行,但是数据库io应该是在不同的线程里执行的,应该可以正常插入。
请大家帮忙释疑。 谢谢。
19 回复
@whzhyh 这个是js 入门知识吧…
类似这种 , 回去认真学习一下闭包…
(function (i){
console.log('index ->' + i);
kitty.save(function(err) {
console.log("saved " + counter++);
if (err) // ...
console.log('meow');
});
})(i);
@thesadboy 100000级别的循环没有到那么快,不会马上完成。。不过按你的说法我加了sleep, 在npm里找了个sleep模块,之后采用类似如下代码,不过依然没有插入。
var sleep = require('sleep');
for (var i = 1; i < 1000000; i++) {
console.log("loop start " + i);
kitty.save(function(err) {
console.log("saved " + counter++);
if (err) // ...
console.log('meow');
});
console.log("loop end");
sleep.sleep(1)//sleep for 1 seconds
}
真是奇了怪了。会不会是mongoose的问题, 想用native driver试下。
改成这样就好了:
for(var i=0; i<10; i++) {
// or process.nextTick
setImmediate(function() {
console.log('loop start');
kitty.save(function(err) {
if(!err) console.log('saved!');
else console.log('save err~');
});
console.log('loop end!');
});
}
去了解下事件循环吧~
谢谢回复。那为什么如下代码不能按预期工作呢.我想知道到底是for循环执行完才save,还是在for循环运行中就异步的执行了save, 但是插入了console.log之后似乎没有按预期运行,谢谢
for (var i = 0; i < 10000; i++) {
// or process.nextTick
console.log('loop start');
setImmediate(function() {
kitty.save(function(err) {
if (!err) console.log('saved!');
else console.log('save err~');
});
});
console.log('loop end!');
}