node.js:函数之外的变量
node.js : Variables outside of functions
我是NodeJS的新手,我试图弄清楚一些东西,但不幸的是,据我所知,我找不到关于它的信息。
基本上,我想在另一个函数中使用一个函数的变量,该函数是主函数的子函数。
这是我的代码:
http.get(url, function(res) {
var body = '';
res.on('data', function(chunk) {
body += chunk;
});
res.on('end', function() {
var jsonResult = JSON.parse(body);
for (var i=0;i<5;i++)
{
gameId = jsonResult.gameList[i].gameId;
url = 'http://somesite.com/' + gameId + '/0/token';
http.get(url, function(res) {
var body = '';
res.on('data', function(chunk) {
body += chunk;
});
res.on('end', function() {
jsonRes = JSON.parse(body);
switch(i)
{
case 0:
var elo0 = jsonRes.interestScore;
module.exports.elo0 = elo0;
break;
case 1:
var elo1 = jsonRes.interestScore;
module.exports.elo1 = elo1;
break;
case 2:
var elo2 = jsonRes.interestScore;
module.exports.elo2 = elo2;
break;
case 3:
var elo3 = jsonRes.interestScore;
module.exports.elo3 = elo3;
break;
case 4:
var elo4 = jsonRes.interestScore;
module.exports.elo4 = elo4;
break;
}
});
}).on('error', function(e) {
console.log("Got error: ", e);
});
}
});
}).on('error', function(e) {
console.log("Got error: ", e);
});
请注意,我没有包括所有内容,只是有问题的部分。我想在开关内部使用循环中的变量I,但它不起作用。
这里的问题是您在异步回调中的switch语句中引用了i
。当您这样做时,您不会在创建函数时获得i的值,而是在循环迭代结束时得到i的最终值。
有几种方法可以解决这个问题——都包括将i的当前循环值捕获在闭包中,以便稍后由回调引用。
例如:
for (var i=0;i<5;i++)
{
(function(idx) {
gameId = jsonResult.gameList[idx].gameId;
url = 'http://somesite.com/' + gameId + '/0/token';
http.get(url, function(res) {
...
res.on('end', function() {
jsonRes = JSON.parse(body);
switch(idx)
{
case 0:
break;
...
}
});
...
});
})(i);
}
这里,为每次通过循环创建一个匿名函数,并立即调用该函数,将循环计数器i
的当前值作为传入参数idx
。
另一种方法(如上面评论中提到的)是将循环的内部重构为一个单独的函数,并通过所有必要的上下文调用它:
function scoreHandler(jsonResult, idx) {
var gameId = jsonResult.gameList[idx].gameId;
var url = 'http://somesite.com/' + gameId + '/0/token';
http.get(url, function(res) {
...
res.on('end', function() {
jsonRes = JSON.parse(body);
switch (idx) {
...
}
});
})
.on('error', function(e) {
console.log("Got error: ", e);
});
}
重构后的循环看起来像:
res.on('end', function() {
var jsonResult = JSON.parse(body);
for (var i = 0; i < 5; i++) {
scoreHandler(jsonResult, i);
}
});
相关文章:
- 带有两个变量函数的Ajax提交表单
- 设置变量函数不起作用
- 为什么使用 ||在变量函数声明中
- Javascript 变量函数不保留值
- 为什么要在函数定义之外引用静态变量(函数属性)
- jQuery 变量函数无法运行
- 循环中的变量函数定义
- javascript onclick设置为变量函数名
- JavaScript:调用已启动类(数据包处理程序)的变量函数
- Javascript测试存根全局变量函数
- Aptana能否识别其他文件中定义的变量/函数
- jquery将其传递给变量函数
- 传递一个变量函数到数组[Javascript]
- 如何使用' this '像一个对象,并通过字符串获得它的变量/函数
- javascript变量/函数的首字母是什么意思?
- Javascript .apply带有变量函数名
- 在JavaScript中添加一个全局变量/函数(特别是NativeScript)
- 变量函数未定义错误
- AngularJS-继续检查变量/函数
- Javascript从本地向全局变量函数添加行