2017-07-30 96 views
0

我是新來的JavaScript和node.js的,所以這可能是基本的JavaScript問題..Node.js的「LearnYouNode」雜耍異步功能不能正常工作

我解決這個LearnYouNode雜耍異步的問題,但我不知道爲什麼我的代碼無法正常工作。

我的代碼:

const http = require('http'); 

var URLs = [process.argv[2], process.argv[3], process.argv[4]]; 
var strs = ["", "", ""]; 
var ctr = 0; 

for(var i = 0; i < 3; i++){ 
    http.get(URLs[i], (response) => { 
     response.setEncoding('utf8'); 
     response.on('data', (data) => { 
      strs[i] += data; 
     }); 
     response.on('end',() => { 
      ctr++; 
      if(ctr == 3){ 
       console.log(strs[0]); 
       console.log(strs[1]); 
       console.log(strs[2]); 
      } 
     }); 
    }); 
} 

我的代碼不能正常工作,但是這個代碼:

const http = require('http'); 

var URLs = [process.argv[2], process.argv[3], process.argv[4]]; 
var strs = ["", "", ""]; 
var ctr = 0; 

function httpGet(i){ 
    http.get(URLs[i], (response) => { 
     response.setEncoding('utf8'); 
     response.on('data', (data) => { 
      strs[i] += data; 
     }); 
     response.on('end',() => { 
      ctr++; 
      if(ctr == 3){ 
       console.log(strs[0]); 
       console.log(strs[1]); 
       console.log(strs[2]); 
      } 
     }); 
    }); 
} 

for(var i = 0; i < 3; i++){ 
    httpGet(i); 
} 

的代碼只能通過使得它作爲一個功能。爲什麼是這樣?

編輯: 問題是,「strs [i] + = data」部分不起作用!

  1. 實際:「」
  2. 預期:「作爲跨爲松節油如何gutful祛斑你這個小開膛去商場逗留的伴侶你的小松土溪山」

  3. 實際:「」

  4. 預期:「枯燥的奶吧,當瘋狂的安博脫穎而出像stickybeak我可以得到一些惡棍,他並沒有一個走私鸚鵡和脫穎而出像一個秀小馬」

  5. 實際:「」

  6. 預計:「你的小松土鬥雞我們要去挖掘機。抓住我們一隻灌木牡蠣,讓你的小蘿蔔德羅堆起來。讓我們得到一些蘋果隊友的compo。 「

  7. 實際:‘’

  8. 預期:‘’
+0

什麼部分不工作?你會得到什麼錯誤? – MarthyM

+0

[JavaScript閉合內循環 - 簡單實用示例]的可能重複(https://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example) –

回答

0

爲什麼在函數中包裝異步方法效果更好的原因是傳遞的索引i與預期的索引相同。

for (var i = 0; i < 3; i++) { 
 
    setTimeout(function() { 
 
     console.log(i) 
 
    }, 1000); 
 
}

輸出始終3,因爲異步方法與調用之前做的for循環完成。

但是,您可以在es6中使用let關鍵字來保留阻塞的範圍變量。

for (let i = 0; i < 3; i++) { 
 
    setTimeout(function() { 
 
     console.log(i) 
 
    }, 1000); 
 
}

+0

謝謝!我認爲這是對的! :d –