在javascript中的for循环中将变量传递给内联函数

时间:2014-07-11 11:49:38

标签: javascript function for-loop inline

我一直试图让这个工作

var http = require('http'),
    parseString = require ('xml2js').parseString;

for (var noOfZones = 1; noOfZones<=8; noOfZones++) {
    var newPath = 'http://192.168.1.200/getZoneData?zone='+noOfZones;
    var req = http.request(newPath, function(zres, noOfZones) {
        zres.setEncoding('utf8');
        zres.on('data', function (zonedata) {
            parseString(zonedata, {
                trim:true,
                childkey:9,
                explicitArray:false,
                explicitChildren:false
            }, function (err, zones) { 
                   console.log(noOfZones);//this one bring back undefined
            });
         });
     });
     req.on('error', function(e) {
        console.log('problem with request: ' + e.message)
     })
     req.end();
}

for循环可以将noOfZones传递给newPath。但是该值未在函数内传递(错误,区域) 我一直在阅读将变量传递给内联函数并试图将它放在各个级别,但它似乎并不适合我。所有我回来的都是未定义的。 (即使我将其字符串化)

2 个答案:

答案 0 :(得分:0)

是什么让您认为request会将其他参数传递给您的回调?

您可以执行以下操作:

var http = require('http'),
    parseString = require ('xml2js').parseString;

Array.apply(null, new Array(8)).forEach(function(_, i) { //make iterable array
    var noOfZones = i + 1; //define scope variable
    var newPath = 'http://192.168.1.200/getZoneData?zone='+noOfZones;
    var req = http.request(newPath, function(zres) {
        zres.setEncoding('utf8');
        zres.on('data', function (zonedata) {
            parseString(zonedata, {
                trim:true,
                childkey:9,
                explicitArray:false,
                explicitChildren:false
            }, function (err, zones) { 
                   console.log(noOfZones); //access it
            });
         });
     });
     req.on('error', function(e) {
        console.log('problem with request: ' + e.message)
     })
     req.end();
});

答案 1 :(得分:-1)

如果你在循环声明中的noOfZones之前删除了“var”,那么应该有效。 所以for (noOfZones = 1; noOfZones<=8; noOfZones++)代替for (var noOfZones = 1; noOfZones<=8; noOfZones++)