node.js for 语句中的阻塞、非阻塞问题
node.js blocking, non-blocking issue in for statement
如何将所有 json 保存到我的 mongoldb 中?
奇怪的是,每次只存储第一个值。
这可能是 blocking/non-blocking 个问题。
json = {
["name":"Karl","id":"azo0"],
["name":"Robert","id":"bdd10"],
["name":"Joan","id":"difj90"],
["name":"Hallyn","id":"fmak88"],
["name":"Michael","id":"vma91"]
};
for(var i = 0; i < json.length; i++){
id = json[i].id;
name = json[i].name;
var ctx = {"id":id,"name":name};
db.json_db.count(ctx).exec(function(err, count) {
if(count < 1){
var model = new User({
"name":json[i].name,
"id":json[i].id
});
model.save(function(){
console.log("ok"+i);
});
}
});
};
插入后,所有数据填充为["name":"Karl","id":"azo0"]
要查看 console.log("ok"+i),它总是打印 "ok0" 而不是 "ok1"、"ok2"、"ok3"... 等等。
我怎样才能避免这个问题?
.exec()
告诉我你正在使用 Mongoose。所以你的循环可以重写为:
const json = [
{name: "Karl", id: "azo0"},
{name: "Robert", id: "bdd10"},
{name: "Joan", id: "difj90"},
{name: "Hallyn", id: "fmak88"},
{name: "Michael", id: "vma91"}
];
for (const item of json) {
const count = await db.json_db.count(item).exec()
if (!count) {
await new User(item).save()
}
}
如果您使用的是 Async 软件包,这是解决您问题的最佳方法...
async.eachSeries(json, (item, done) => {
let user = new User(
{
"name":json[i].name,
"id":json[i].id
},
(err, user) => {
if(err){
// handle err
}
return done();
}
);
});
如何将所有 json 保存到我的 mongoldb 中? 奇怪的是,每次只存储第一个值。 这可能是 blocking/non-blocking 个问题。
json = {
["name":"Karl","id":"azo0"],
["name":"Robert","id":"bdd10"],
["name":"Joan","id":"difj90"],
["name":"Hallyn","id":"fmak88"],
["name":"Michael","id":"vma91"]
};
for(var i = 0; i < json.length; i++){
id = json[i].id;
name = json[i].name;
var ctx = {"id":id,"name":name};
db.json_db.count(ctx).exec(function(err, count) {
if(count < 1){
var model = new User({
"name":json[i].name,
"id":json[i].id
});
model.save(function(){
console.log("ok"+i);
});
}
});
};
插入后,所有数据填充为["name":"Karl","id":"azo0"] 要查看 console.log("ok"+i),它总是打印 "ok0" 而不是 "ok1"、"ok2"、"ok3"... 等等。
我怎样才能避免这个问题?
.exec()
告诉我你正在使用 Mongoose。所以你的循环可以重写为:
const json = [
{name: "Karl", id: "azo0"},
{name: "Robert", id: "bdd10"},
{name: "Joan", id: "difj90"},
{name: "Hallyn", id: "fmak88"},
{name: "Michael", id: "vma91"}
];
for (const item of json) {
const count = await db.json_db.count(item).exec()
if (!count) {
await new User(item).save()
}
}
如果您使用的是 Async 软件包,这是解决您问题的最佳方法...
async.eachSeries(json, (item, done) => {
let user = new User(
{
"name":json[i].name,
"id":json[i].id
},
(err, user) => {
if(err){
// handle err
}
return done();
}
);
});