Array.push不能正常工作

时间:2014-04-09 19:46:09

标签: node.js amazon-web-services

我使用AWS-SDK来描述特定区域中的所有实例。我有超过100个实例。我必须列出instanceId,volumeId和所有100个实例的设备名称。

我的代码看起来像这样。我希望在 miniregionoregon.json 文件中有100个不同的实例。但我得到的只是一个重复100次的实例。我在 params 上做了console.log - 这很好,因为我获得了100个不同的值ste

但是paramArray是有问题的。 paramArray.push(param)似乎没有所需的结果。我已经上了差不多一个小时了,我已经决定这肯定需要一双新鲜的眼睛。

var fs = require('fs');
var file = __dirname + 'region_oregon.json';

fs.readFile(file, 'utf8', function (err, data) {
    if (err) {
        console.log('Error: ' + err);
        return;
    }

    data = JSON.parse(data);

    var outerindex = 0;
    var params = {};
    var paramArray = [];

    (function getDataRecur() {

        if (outerindex > data.length - 1) {
            console.log(paramArray);
            var fs = require('fs');
            fs.writeFile(__dirname + 'miniregionoregon.json', JSON.stringify(paramArray), function (err) {
                if (err) {
                    console.log(err);
                } else {
                    console.log("The file was saved!");
                }
            });
        } else {
            var instances = data[outerindex].Instances;
            console.log('instances_length', instances.length);
            var innerindex = 0;

            (function getInstanceRecur() {
                if (innerindex > instances.length - 1) {
                    console.log('done reading instances');
                    return;
                } else {
                    //console.log(dataArr[innerindex].Instances[0].InstanceId);
                    console.log(innerindex);
                    params.InstanceId = instances[innerindex].InstanceId;
                    params.VolumeId = instances[innerindex].BlockDeviceMappings[0].Ebs.VolumeId;
                    params.Device = instances[innerindex].BlockDeviceMappings[0].DeviceName;

                    paramArray.push(params);

                    innerindex++;
                    getInstanceRecur();
                }
            }());


            outerindex++;
            getDataRecur();
        }
    }());


});

1 个答案:

答案 0 :(得分:2)

params仅初始化一次。所以,每次都行

params.InstanceId = instances[innerindex].InstanceId;
params.VolumeId = instances[innerindex].BlockDeviceMappings[0].Ebs.VolumeId;
params.Device = instances[innerindex].BlockDeviceMappings[0].DeviceName;

paramArray.push(params);

运行,它们作用于同一个对象 - 覆盖这3个属性,然后将另一个对象的引用推送到数组上。相反,您应该在设置这些属性并推送它之前初始化params