Mongoose保存循环丢失了迭代器

时间:2016-09-16 16:45:50

标签: javascript node.js mongodb mongoose

我必须用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.

我该怎么办?

1 个答案:

答案 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