我必须用mongoose在我的数据库中保存很多对象。
以下是我的代码示例:
for (var i = 0; i < userdata.length; i++) {
var newCompany = Company({
name: userdata[i].company_name
});
newCompany.save(function(err, c) {
if (err) throw err;
var newGeoloc = Geolocation({
latitude: userdata[i].latitude,
longitude: userdata[i].longitude
});
newGeoloc.save(function(err, g) {
if (err) throw err;
// Create new Office
var newOffice = Office({
name : userdata[i].office_name,
address : userdata[i].address,
city : userdata[i].city,
zip_code : userdata[i].zip_code,
geolocation : g._id,
company : c._id
});
// Save the Office
newOffice.save(function(err, officeCreated) {
if (err) throw err;
console.log('Office created!');
});
});
}
为什么保存地理定位对象i
时我的latitude: datas[i].latitude
变量获得了数组userdata.length
的最大长度?例如,如果userdata有150个对象,那么当我创建地理定位对象时,我总是得到150.
我该怎么办?
答案 0 :(得分:2)
由于for
循环在不等待save
函数中接收回调的情况下运行,因此您可以使用闭包将i
的值保持为自调整函数的本地值如下所示。
for (var i = 0; i < userdata.length; i++) {
(
function(index) {
var newCompany = Company({
name: userdata[index].company_name
});
newCompany.save(function(err, c) {
if (err) throw err;
var newGeoloc = Geolocation({
latitude: userdata[index].latitude,
longitude: userdata[index].longitude
});
newGeoloc.save(function(err, g) {
if (err) throw err;
var newOffice = Office({
name : userdata[index].office_name,
address : userdata[index].address,
city : userdata[index].city,
zip_code : userdata[index].zip_code,
geolocation : g._id,
company : c._id
});
// Save the Office
newOffice.save(function(err, officeCreated) {
if (err) throw err;
console.log('Office created!');
});
});
});
}
)(i);
}
每次循环运行时调用自调用函数时,i
的值将复制到变量index
。