2017-05-25 63 views
0

我想解決雜耍異步問題learnyounodelearnyounode:雜耍異步問題

以下是我所嘗試過的。但我沒有得到期望的輸出。我可以通過在谷歌搜索找到解決方案。但我想要的是學習節點基礎知識。有人可以指導我哪裏出錯嗎?

var http = require('http'); 
var bl = require('bl'); 
var output = []; 
var cnt = 0; 

for (var i in process.argv) { 
    if (i > 1) { 
    http.get(process.argv[i],function(response){ 
     response.pipe(bl(function(err,data){ 
     output[cnt] = data.toString(); 
     cnt++; 
     if (output.length === (process.argv.length - 2)) { 
      printResult(output); 
     } 
     })); 
    }); 
    } 
} 

function printResult(output){ 
    for (var i = 0; i < output.length; i++) { 
    console.log(output[i]); 
    } 
} 

輸出我得到:

  1. 實際:「的布里克爾其中沙紮了我們一些鬆土Gutful配備提防極小二一本耶普你這小松土 爛隊友讓我們得到一些惡棍「
  2. 預期:‘布里克爾其中沙紮了我們一些鬆土Gutful配手錶本耶普出了極小的二你這小松土 爛隊友讓我們得到一些惡棍’

  3. 實際情況:「小心她的右側aussie規則會導致空中pingpong。他沒有一個戰鬥夥伴讓我們投擲戰鬥。 「

  4. 預計:」建造像一個野性,沒有後顧之憂像一個bonzer。像我的家人一樣,我的臥室出來了。儘管乾燥,但沒有憂慮shazza讓我們有些搖擺不定。 「

  5. 實際:」建造就像一個野性,沒有後顧之憂就像一個邦澤。像我的家人一樣,我的臥室出來了。儘管乾燥,但沒有憂慮shazza讓我們有些搖擺不定。 「

  6. 預計:」小心她的空中乒乓球時,她會正確aussie規則footy。他沒有一個戰鬥夥伴讓我們投擲戰鬥。 「

  7. 實際:‘’

  8. 預期:‘’
+1

您應該在您的問題中包含所需的輸出。 –

+0

什麼是期望的輸出,你得到什麼? – Soviut

+0

@JoeClay輸出添加。 –

回答

2

如果我沒有記錯的問題,你必須打印在同一順序的響應作爲提供的網址命令行參數

您的解決方案的問題在於,您實際上並沒有以正確的順序存儲您的響應
此部分代碼:

// ... 
output[cnt] = data.toString(); 
cnt++; 
// .... 

您異步開了三個http請求和您正在使用的計數器cnt保存響應中output陣列。由於響應可以以任何順序到達,因此不能保證響應將按照請求被解除的順序保存。例如,如果Request 3rd的響應首先出現,它將被存儲在索引0處的output數組中,這不是您想要的。

解決此問題而不是使用獨立計數器。使用用於激發http請求的現有變量i。因此對於請求1響應將被保存在索引0處,因爲請求2響應將被保存在索引1處等等。

寫你http請求在單獨的功能,並通過索引i並使用此索引i保存您的迴應。

//.... 
for (var i in process.argv) { 
    if (i > 1) { 
     httpGet(i); 
    } 
} 


function httpGet(index) { 
    http.get(process.argv[index], function(response) { 
     response.pipe(bl(function(err, data) { 
      output[index - 2] = data.toString(); 
      cnt++; 
      // Use cnt to decide if all the responses have arrived and then print 
      if (cnt === (process.argv.length - 2)) { 
       printResult(output); 
      } 
     })); 
    }); 
} 
// ..... 

HTTP GET請求需要包裹在否則一個單獨的函數,變量i的響應塊的匿名函數內的值將是相同的每個功能(這將是在這種情況下4)。這是經典的關閉問題。我建議你閱讀這些得到詳細的解釋:

JavaScript closure inside loops – simple practical example

Creating closures in loops: A common mistake

讓我知道這是否爲你工作。

+0

謝謝,非常豐富。但變量'我'每次仍然4,並沒有得到應用您的更改所需的保存。 –

+0

@DushyantJoshi你說得對。這是關閉問題。我已經更新了答案。請立即檢查。 – abhishekkannojia

+0

_http get請求需要封裝在一個單獨的函數中,否則,響應塊的匿名函數內的變量i的值對於每個函數_將是相同的。答案的寶石。你只是搖滾。並感謝鏈接/答案。 –