2016-11-30 7 views
2

多くのページ(同じページだが異なるデータ)からデータを取得しようとしています。問題は、ノードの非同期要求メソッドと、 'for'ループがあると思います。 (私はnodejsで新しいです)。インクリメンタルパラメータを使用したループGETリクエスト

リクエストを使用してJSONデータを取得するためにforループを使用しますが、リクエストの最初の応答を得る前にループが終了しました(私は思う)。

これは私がJSONに乗る毎日のために、コードです:確定すると

var str = []; 
    for (var i = 0; i < 2000; i++) { 

     var url = 'https://WEbPAGE.com/public?start='+prevDate+'&end='+nextDate; 

     request(url, (error, response, body)=> { 
      if (!error && response.statusCode === 200) { 

      str.push(body+'\r\n') 

      } 
     }) 

     prevDate = nextDate; 
     nextDate += oneDay; 

     if (nextDate >= today) break; 
    }; 

、私はリクエストからすべてのデータを得るが、注文しないと、配列の位置の多くは空です。

+0

bluebirdライブラリを使用してリクエストモジュールを約束します.http://stackoverflow.com/questions/28308131/how-do-you-properly-promisify-request http://bluebirdjs.com/docs/api/promiseを使用してください。 all.html –

+0

この質問をご覧ください:http://stackoverflow.com/questions/23035296/simplest-way-of-doing-a-callback-when-two-ajax-request-are-complete – KungWaz

+0

@AnmolMittal約束初心者のための混乱に追加します。私は、コールバックを理解することは、Node.js(これらの非同期質問の多すぎるもの)の必要な部分だと思います。ユーザーに約束のライブラリーを呼び出すと、コールバックの仕組みが分かりません。Node.JS – xShirase

答えて

2

forループの代わりにコールバックを使用し、日付が一致しない限り同じ関数を実行し、date = today、callbackを一度実行します。

function addData(prevdate,nextDate,cb){ 
    var url = 'https://WEbPAGE.com/public?start='+prevDate+'&end='+nextDate; 
    request(url, (error, response, body)=> { 
     if (!error && response.statusCode === 200) { 
      str = str.concat(body+'\r\n') 
      prevDate = nextDate; 
      nextDate += oneDay; 
      if (nextDate >= today){ 
       cb() 
      }else{ 
       addData(prevdate,nextDate,cb) 
      } 
     } 
    }) 
} 

addData(firstPrevDate,firstNextDate,function(){ 
    // str is ready! 
}); 

編集:コメントで指摘したように、この例では、要求はシリアルに実行されます。一度にいくつかを実行する方法を変更することはできますが、おそらく2000年の並列要求を実行しないでください。そうしないと、時間がかかるでしょう。

+0

要求は並列に実行されるのではなく、並列に実行されます –

+0

並列要求を2000回起動することはそれほど素晴らしい考えではありませんか? – xShirase

関連する問題