2017-05-25 9 views
0

私はジャグリング非同期問題learnyounodeを解決しようとしています。learnyounode:非同期問題をジャグリング

以下は私が試したことです。しかし、私は希望の出力を得ていない。私はGoogleで検索して解決策を見つけることができます。しかし、私が望むのは、ノードの基本を学ぶことです。誰かが私がどこに間違って行くのか教えてくれますか?

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. ACTUAL:「シャッツァは私たちにいくつかのリッパーを得たbrickieのGutfulが貧弱ジ用ウォッチアウトでバニップを、是非あなたは少しリッパー 。腐った仲間は、いくつかのlarrikinを取得することができます "
  2. EXPECTED:『。。。シャッツァは、私たちにいくつかのリッパーを得たbrickieのGutfulあなたは少しリッパー 腐った仲間は、いくつかのlarrikinを取得することができます貧弱ジのための時計でバニップ出てくる』

  3. ACTUAL:「彼女がオーストラリアの規則に適合するようになると、空中卓球に気をつけてください。彼は戦闘機を持っていないので、戦闘機を投げることができます。 "

  4. 期待されています:"野生のように建てられた心配は、ボンザのように際立っていません。ボードズのように私のフラットアウトgrundies来る。乾燥したとして mokkies心配shazza私たちにいくつかの岩を取得しました。 "

  5. ACTUAL:"野生のように建てられ、心配する人はボンゼルのように目立ちません。ボードズのように私のフラットアウトgrundies来る。乾燥したとして mokkies心配shazza私たちにいくつかの岩を取得しました。 "

  6. 期待されています:"彼女が正しいオージールールになるときに、空中卓球に気をつけてください。彼は戦闘機を持っていないので、戦闘機を投げることができます。 」は、実際の

  7. : 『』 EXPECTED

  8. : 『』
+1

おそらくあなたの質問に希望の出力を含める必要があります。 –

+0

希望の出力は何ですか?代わりに何を得ていますか? – Soviut

+0

@JoeClay出力が追加されました。 –

答えて

2

私が正しく問題を覚えている場合は、URLが提供されているのと同じ順序で応答を印刷する必要がありコマンドライン引数

あなたの解決策の問題は、実際に応答が正しい順序で格納されていないことです。
コードのこの部分:

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

あなたは非同期で3つのhttp要求を発射したと、あなたはカウンターcntを使用してoutput配列内の応答を保存しています。応答は任意の順序で到着することができるので、要求が発砲されたのと同じ順序で応答が保存されるという保証はありません。たとえば、Request 3rdの応答が最初に来た場合は、0outputの配列に格納されます。

独立カウンタを使用する代わりにこの問題を修正します。 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

ありがとう、非常に有益。変数 'i'は毎回4のままで、変更を適用することで必要に応じて保存されません。 –

+0

@DushyantJoshiあなたは正しいです。それは閉鎖の問題です。私は答えを更新しました。今すぐご確認ください。 – abhishekkannojia

+0

_http getリクエストは、別の関数でラップする必要があります。そうでなければ、レスポンスブロックの無名関数内の変数iの値は、関数ごとに同じになります。答えの宝石。あなただけのロック。そしてリンク/答えに感謝します。 –