2016-09-13 2 views
1

こんにちは私はwhileループから壊れてしまいます。その中で私は非同期関数を呼び出しています。私はその非同期呼び出しの出力からの特定のフィールドが空であるかどうかをチェックしなければなりません。そうしなければ、私はその非同期関数に再度呼び出します。私はこれを試しました:中から中断する毎に

var options = { 
     headers : { 
     'Fk-Affiliate-Id':'xxxxxxx' , 
     'Fk-Affiliate-Token' : 'xxxxxxxxxxxxxxxx' 
     } 
    }; 
var state = ['approved','tentative','cancelled','disapproved']; 
state.forEach(element => { 
    options.url = 'https://affiliate-api.flipkart.net/affiliate/report/orders/detail/json?startDate='+startDate+'&endDate='+endDate+'&status='+element+'&offset=0'; 
    loop : while(true){ 
     // This is the async call 
     request.get(options, (err, res, body) => { 
      var data = JSON.parse(body); 
      console.log(data); 
      // I have to check whether next is empty or not ? 
      if(data.next === ''){ 
      // I will perform some action on data here 
      break loop; 
      } 
      else{ 
      // I will perform some action on data here 
      options.url = data.next; 
      } 
     }); 
     } 
}); 

しかし、これはエラーを示していますUnsyntactic break。 whileループを解除するには?

+0

あなた 'break'文が非同期コールバックの内側にあります。他の関数の中からwhileループを抜け出せないし、非同期関数ではないことも確かである。そのコードを実行させても、非同期コールバックは 'while()'ループが終了するまで呼び出されないため、動作しません。 JSはシングルスレッドです。 'while()'ループは、ajaxコールバックが呼び出される前に終了する必要があります。これはまったく間違ったコードです。あなたが成し遂げようとしていることを言い返してください。そして、人々はそれを達成するための適切な方法を助けることができます。 – jfriend00

+0

私はbody変数で非同期呼び出しからデータを取得します。次のフィールドが空であるかどうかを確認します。次が空でないなら、私は次のURLにそのURLを要求しなければなりません。それ以外の場合は、状態変数から別の要素を壊して取得し、プロセスを繰り返します。 –

+1

'このサイトの動作方法は、編集リンクを使用して、あなたの質問に達成するための情報を追加する必要があります。コメント。 – jfriend00

答えて

1

ループしている間は必要ありません。あなたは、州のいずれかの望ましい結果に達したときに停止したいだけです。 これは、非同期呼び出しが完了するまで待つ必要があることを意味し、その後は別の状態を続行する必要があります。解決策の1つは、(可能であれば)呼び出しを同期させることです。 別の解決策は、各状態の処理のために別の関数を作成し、非同期呼び出しのコールバックからそれを呼び出すことです:

var state = ['approved','tentative','cancelled','disapproved']; 
// starting with first state 
processState(0); 

function processState(stateIdx){ 
    if(stateIdx >= state.length){ 
     // we tried all states and no success. 
     return; 
    } 
    // some code 
    request.get(options, (err, res, body) => { 
     // some code 
     if(data.next !== ''){ 
      // we have more records for this state - call it one more time. 
      processState(stateIdx); 
     } else { 
      // done with this state, try next one. 
      processState(stateIdx + 1); 
     } 
    }); 
} 
+0

いくつかのアクションを実行する投稿を編集しました私はflipkartからいくつかのレコードを取得しています。 500以上のレコードがある場合、それは「次へ」のレコードのURLを送信します。すべてのレコードを取得する必要があるので、私は次があるかどうかをチェックしています。次のレコードが存在する場合は、それ以上のレコードがあることを意味し、そのレコードが次に存在するレコードに対して別の要求をしなければなりません。次の手段でリンクがない場合、次の '状態'を確認する必要があります –

+0

@DevendraVerma:これは、レコードがさらにあれば同じ状態でその関数を呼び出す必要があることを意味します。私は答えを更新しました。 Btw、各状態は独立しており、同時に処理することができますか? – SergeyS

+0

OK、私は最終的に私が何をしなければならないか答えを得た –

関連する問題