2013-02-25 72 views
0

附加的是有问题的代码。使用Javascript进行字符串数组转换

var http = require("http"); 
var i = 0; 

var hostNames = ['www.1800autoland.com','www.youtube.com','www.1800contacts.com']; 

for(i;i<hostNames.length;i++){ 
    var options = { 
     host: hostNames[i], 
     path: '/' 
    }; 
    http.get(options, function(res){ 
     console.log("url: " + hostNames[i]); 
     console.log("status: " + res.statusCode); 

     for(var item in res.headers){ 
      if(item == "server"){ 
       console.log(item + ": " + res.headers[item]); 
      } 
      if(item == "x-powered-by"){ 
       console.log(item + ": " + res.headers[item]); 
      } 
      if(item == "x-aspnet-version"){ 
       console.log(item + ": " + res.headers[item]); 
      } 
     } 
     console.log("\n"); 
    }) 
}; 

我有网址的阵列,并且该问题我来咨询站点是在我的代码,主机名[I]不显示第n(“I”在这种情况下或)指数作为一个字符串。控制台中的输出总是“未定义”。我试过String(),toString()和一些不同的方法无济于事。有人能指出我正确的方向吗?我需要做什么转换?

+1

你试过hostNames.get(I) – 2013-02-25 17:28:03

+1

否否否,问题是回调。我在回调方法中不再有效。 – Joe 2013-02-25 17:29:39

+0

在for循环中初始化我。 for(var i = 0; ...){} – tymeJV 2013-02-25 17:30:34

回答

1

这是closure问题,试试这个:

(function (i) { 
http.get(options, function(res){ 
    console.log("url: " + hostNames[i]); 
    console.log("status: " + res.statusCode); 

    for(var item in res.headers){ 
     if(item == "server"){ 
      console.log(item + ": " + res.headers[item]); 
     } 
     if(item == "x-powered-by"){ 
      console.log(item + ": " + res.headers[item]); 
     } 
     if(item == "x-aspnet-version"){ 
      console.log(item + ": " + res.headers[item]); 
     } 
    } 
    console.log("\n"); 
}) 
})(i); 
+0

谢谢!并感谢您关闭链接。 – theGreenCabbage 2013-02-25 17:40:57

0

您应该使用.get(i)方法来检索该项目。正如其他人所说的,您不需要像阵列中那样初始化计数器。

3

这是典型的收尾由于异步性而发生的问题。当您的回调触发i的值将始终为hostNames.length

要修复它关闭周围的i值:

http.get(options, (function(res) { // '(' before function is optional, I use it to indicate immediate invocation 
    return function (i) { // this is the closed value for i 
     console.log("url: " + hostNames[i]); 
     console.log("status: " + res.statusCode); 
     // .. etc 
    }; 
}(i))); // immediate invocation with i 

实现有关使用闭包这样什么是重要的,是你正在做一些匿名函数,而不是一个。每个函数都绑定到它自己的值i


,以避免写的代码,这些奇怪位最简单的方法是不直接使用for循环,但使用map功能。像:

function array_map(array, callback) { 
    var i, len = array.length; 
    for (i = 0; i < len; i += 1) { 
     callback(i, array[i]); 
    } 
} 

这使它自动关闭i的值。你的循环将类似于:

array_map(hostNames, function(i, hostname) { // i and hostname have the closed value 
    // .. etc 
}); 
+0

我觉得这很难理解。闭包是否更有意义,因为我在JavaScript中编程更多?有没有推荐的读取? – theGreenCabbage 2013-02-25 17:42:31

+0

我认为对于来自非异步语言的人来说,闭包是JavaScript中比较难的部分之一。不要害怕它,拥抱它。关闭功能非常强大,所以我希望它们在未来对你更有意义:)我用我的'array_map'建议更新了我的答案。 – Halcyon 2013-02-25 17:44:59

+0

关于JavaScript的一个很棒的系列是“Crockford on JavaScript”。 http://www.youtube.com/watch?v=JxAXlJEmNMg(第1卷)。我希望这些能够告诉你JavaScript是多么棒(或者可以)。 – Halcyon 2013-02-25 17:48:13

相关问题