2013-02-25 28 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

相關問題