2016-06-21 7 views
0

私は、連続して実行する必要がある3つのajax呼び出しを持っています。私の問題は$ intervalでこれをどうやってやるかということです。これを達成する別の方法がありますか?どのようにajax呼び出しを繰り返し、必要に応じて角度でキャンセルすることができますか?

私はこれらの呼び出しがあります。

var server1 = getDataFromServer1() 
var server2 = getDataFromServer2UsingServer1Data(server1); 
var server3 = getDataFromServer3UsingServer2Data(server2); 

しかし、私はそれらを繰り返すが、一定の価値がある場合にはキャンセルできるようにしたい。待つことはないので、getDataFromServer3UsingServer2Dataからデータを取得する前に$ intervalでgetDataFromServer1()を実行しません。これを達成する最良の方法は何ですか?ありがとう。

+0

'getDataFromServer1'からデータを返した後で' getDataFromServer2UsingServer1Data() 'を呼び出すだけですか? –

+0

はいサー........ – KingKongFrog

答えて

1

私は、これは正しいアプローチであるかどうかを確認していないかではないが、あなたはこのような何かを試すことができます。

function getDataFromServer() { 
    getDataFromServer1().then(function(res1) { 

    if (value === YOU_CERTAIN_VALUE) { 
     //do what you want 
     return 
    } 
    getDataFromServer2UsingServer1Data(server1).then(function(res2) { 

     if (value === YOU_CERTAIN_VALUE) { 
     //do what you want 
     return 
     } 

     getDataFromServer3UsingServer2Data(server2).then(function(res3) { 
     if (value === YOU_CERTAIN_VALUE) { 
      //do what you want 
      return; 
     } 
     //calling the function again. 
     getDataFromServer(); 
     }); 
    }); 
    }); 

} 
+1

連鎖約束は、通話間に依存関係がある場合に行く方法です。良い例 –

0

これはpromiseを使用して行うことができます。

あなたは$httpから結果を返すです。ここ

function getDataFromServer1(){ 
    return $http.get('your_url', {options}); 
} 

、以下のようなサーバー呼び出しのそれぞれから約束を返す必要があります。 $httpは、この関数を呼び出すときにこの約束を処理できるように約束を返します。今

あなたはこのようなあなたの条件を達成することができ、

getDataFromServer1().then(function(response){ 
    if(response.data == someValue){ 
     // if you condition satisfied then call next server call 
     getDataFromServer2UsingServer1Data().then(function(response){ 
       if(some_condition){ 
        getDataFromServer3UsingServer2Data().then(function(response)  { 
        }); 
       } 
     }); 
    } 
}); 
0

チェーンの約束は、このような依存性がある場合にエラーとエレガントを処理するための良い方法です。

function getDataFromServer1() { 
    return $http 
     .get('/some/url/in/server1') 
     .then(function(response) { 
      $scope.server1Data = response.data; // If this data is needed in scope 
      return response.data; 
     }); 
} 

function getDataFromServer2WithServer1Data(server1Data) { 
    if(server1Data.condition === 'not met') { 
     return $q.reject('server1 condition not met'); 
    } 

    return $http 
     .get('/some/url/in/server2') 
     .then(function(response) { 
      $scope.server2Data = response.data; // If this data is needed in scope 
      if(server2Data.condition === 'not met') { 
       throw 'server2 condition not met'; // other way to abort the chain, it reaches the final catch block 
      } 

      return response.data; 
     }); 
} 

function getDataFromServer3WithServer2Data(server2Data) { 

    return $http 
     .get('/some/url/in/server3') 
     .then(function(response) { 
      $scope.server3Data = response.data; // If this data is needed in scope 
      return response.data; 
     }); 
} 

getDataFromServer1() 
    .then(getDataFromServer2WithServer1Data) 
    .then(getDataFromServer3WithServer2Data) 
    .catch(function(rejectReason){ 
     console.log('error occured', rejectReason); 
    }); 

このblogは、このシナリオの詳細について説明し、それを介して行くことをお勧めします。

+0

'$ q.reject() 'の代わりに' then() 'の中にエラーをスローすることもできます。 – charlietfl

+0

@charlietfl、答えを更新しました。 –

関連する問題