你如何重复ajax调用,如果需要角度可以取消它?

时间:2016-06-21 03:44:46

标签: javascript angularjs ajax

我有3个需要串行运行的ajax调用。我的问题是如何使用$ interval执行此操作。还有另一种方法来实现这一目标吗?

我有这些电话。

<Test>
     <SubTest> 123.00 </SubTest>
</Test>

但是我想重复它们但是如果我得到一定的值就可以取消它们。在从getDataFromServer3UsingServer2Data获取数据之前,$ interval不会运行getDataFromServer1(),因为它不会等待。什么是实现这一目标的最佳方式?感谢。

3 个答案:

答案 0 :(得分: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完成此操作。

您应该从下面的每个服务器调用中返回一个承诺,

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

在这里,您将返回$http的结果。 $http将返回一个promise,以便您在调用此函数时可以处理此承诺。

现在你可以实现这样的要求,

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)        {
                    });
               }
         });
    }
});

答案 2 :(得分: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解释了有关此方案的更多信息,建议您仔细阅读。