节点js中的闭包不按预期工作

时间:2016-03-13 17:56:32

标签: javascript node.js closures

我有这段代码:

index

使用临时变量 0 1 创建闭包。这输出var http = require("http"); var urls = ["http://yahoo.com","http://google.com"]; for( var i=0; i < urls.length; i++) { http.get( urls[i] , function(res) { var j = i; res.setEncoding('utf-8'); res.on("data", function(d) { console.log(j); }); }); } 正如所料,打印我想要在闭包中捕获的值。

类似于http get callback的代码不起作用。


2
2

此代码输出: if (event.getSource() == b) { Thread th=new Thread() { public void run() { b.setText("1"); try { Thread.sleep(5000); }catch (Exception e) { } b.setText("2"); try { Thread.sleep(5000); }catch (Exception e) { } b.setText("3"); } }; th.start(); }

我错过了什么?

2 个答案:

答案 0 :(得分:1)

var j = i;将设置i的值,这是第一次响应时数组的长度,这就是每次登录时获得2的原因。

调用匿名函数作为http.get的第二个参数,它将返回内部函数来处理响应,它还将记住创建它的环境。传递的参数i的值将存储在内存中以供稍后使用。

试试这个:

&#13;
&#13;
var http = require("http");

var urls = ["http://yahoo.com", "http://google.com"];

for (var i = 0; i < urls.length; i++) {
  http.get(urls[i], (function(i) {
    return function(res) {
      res.setEncoding('utf-8');
      res.on("data", function(d) {
        console.log(i);
      });
    }
  })(i));
}
&#13;
&#13;
&#13;

答案 1 :(得分:1)

javascript(es5)中没有块范围。所以你使用的for循环不会成功。相反,尝试:

  urls.forEach(function(url, i){
      http.get( url , function(res) {           
        res.setEncoding('utf-8');
        res.on("data", function(d) {
            console.log(i);
        });
    });