我有一个用户列表,我尝试将其存储/更新到我的mongoDB数据库中。
但是只考虑我列表中的最后一个元素,其他用户不会进入then
函数。
我是Nodejs的新手,这似乎是由于我不理解的同步行为。
var User = require('../to/path/user-service');
....
userList.forEach(function(user) {
try {
User.updateUser(user);
} catch(err) {
return console.error(err);
}
});
用户服务
...
var User = mongoose.model('User', userSchema);
console.log(user.name);
export.updateUser = function (user) {
Issue.findOne({name: user.name})
.then((user) => {
if(user) console.log(user.name + ' has been updated');
else console.log(user.name + ' has been created');
}).catch((err) => console.error(err));
};
输出继电器
John
Paul
Alex
Alex has been created
Alex has been created
Alex has been created
答案 0 :(得分:2)
问题与JavaScript闭包有关。将函数添加到函数队列时,会添加它及其变量。在这种情况下,添加变量user
。当函数终止并调用updateUser()函数时,user
变量是Alex,因此Alex会被添加三次。在此处阅读有关闭包的更多信息:https://developer.mozilla.org/en/docs/Web/JavaScript/Closures
以下是解决问题的一种方法:
userList.forEach(function(user) {
var closureUser = user;
try {
console.log(closureUser.name);
closureUser.updateUser(closureUser);
} catch(err) {
return console.error(err);
}
});