2016-11-20 18 views
0

私はunirestライブラリを使用して、offsetとlimitsパラメータで分割されたapiからすべてのデータを取得しています。結果。Node.js - whileループの中でhttpリクエストが動作しない

データを反復処理するためにwhile条件を使用していますが、結果が返されない時点で、 'incomplete'変数をfalseに設定してループを終了します。

何らかの理由で、'call_and_retry_last allocation failed'エラーが発生するまで何も起こりません(データがデータベースに追加されず、コンソールに何も出力されないため)長い間)。しかし、whileの条件をすべて削除すると、コードは正常に動作します。

これが機能しない特別な理由はありますか?

は、ここに私のコードです:

var limit = 50, 
    offset = 0, 
    incomplete = true; 

while (incomplete) { 

    // make api call 
    unirest.get("https://www.theapiurl.com") 
     .header("Accept", "application/json") 
     .send({ "limit": limit, "offset": offset }) 
     .end(function (result) { 

      // parse the json response 
      var data = JSON.parse(result.raw_body); 

      // if there is data 
      if(data .length > 0) 
      { 
       // save the api data 
       // + increase the offset value for next set of data 
       offset += limit; 
      } 
      else 
      { 
       // if there is no data left, end loop 
       incomplete = false; 
       console.log("finished!"); 
      } 
     }); 
    } 
+1

としてrecurrcive機能を使用することができます。しかし、その頃には、あなたの反応が現れ、ループはさらに進む。滝やシリーズモデルでAsync.ioなどを使用してください。 – Anistark

+1

asyncとsyncコードを一緒に使用しようとしています。 Whileループはあまりにも多くのリクエストを送信し、スタックサイズのエラーが発生します。 http://caolan.github.io/async/を使用するか、約束を作成してPromise.allで実行してみてください。お役に立てれば。 –

+1

非同期アクションが完了するまでループを一時停止させるには、ループのボディの最後に 'fut.wait()'、最後に 'fut.return()'を見てください。 '.end'の本体(_nodejs_でのみ可能) –

答えて

0

あなたはそれが動作する必要があります

function getServerData(offset){ 

//Your api service with callback.if there is a data then call it again with the new offset. 

} 
function getServerData(1);