AngularJS:连续发送$ http.get请求,直到达到某个条件

时间:2016-08-30 14:51:53

标签: angularjs callback get

正如标题所说,我想向服务器发送$ http.get请求,直到返回的结果符合条件。

这就是我的尝试:

    var searchComplete = false;
    var sendGetReq = true;

    while(!searchComplete) // #2 and then jumps here
    {
       if(sendGetReq)
       {
         sendGetReq = false;  // #1 execution reaches here
         $http.get('/user/getCondition', {params: {condition: $scope.condition}).
        success(function (condition, status, headers, config) {
         ...
         ...
         if(condition)
         { searchComplete = true; }
         else
         { sendGetReq = true; }
    }
}

然而,$ http.get请求永远不会发生。永远不会达到这种说法。当我调试时,我看到执行将转到sendGetReq=false,然后跳转到while(!searchComplete)。 GET请求永远不会被发送。

请有人解释一下:

  1. 为什么执行永远不会达到GET请求并跳回来
  2. 执行此连续GET请求的推荐方法是什么?
  3. 谢谢。

5 个答案:

答案 0 :(得分:3)

为什么不将它们全部放在一个函数中并在条件满足时自行调用?像这样你应该使用.then而不是.success:

$scope.load = function(){
  $http.get('/user/getCondition', {params: {condition: $scope.condition}).
    then(function (condition, status, headers, config) {

    if (condition){
       $scope.load();
    }

  });
}

希望有帮助=)

答案 1 :(得分:2)

不要使用while (true),特别是在JS中。

JS在一个线程中工作。 $http.get永远不会运行,因为你的主线程在你的无限循环中停滞不前,并且没有机会让其他线程运行。

<强>更新

function getHttpPromise() {
    return $http.get('/user/getCondition', {params: {condition: $scope.condition}).
        success(function (condition, status, headers, config) {
         ...
         ...
         if(condition)
             return true;//or any result you want to resolve
         else
             return getHttpPromise();
    }
}

getHttpPromise函数返回promise,它将在condition上解析,在其他情况下,它会继续等待get get请求。

要使用它,请运行以下代码。

getHttpPromise().then(function (result) {
    // Will be called only when condition will be successful
});

答案 2 :(得分:2)

$http.get是异步调用,它会在服务器的响应中遇到成功或错误(两者都被弃用,然后使用)功能。当函数到达此行时

sendGetReq = false;  // #1 execution reaches here

它进行$http.get调用(这是异步),然后将控件移动到下一次迭代。这是异步调用的主要目的。

如果要进行连续调用,可以在函数中编写$http.get调用,并使用Angular JS的interval服务调用该函数。

$interval

$scope.func = function(){
   if(condition)
   {
      $http.get....
   }      
}

$interval($scope.func, 1000)

其中1000是调用函数的时间间隔(以毫秒为单位)

答案 3 :(得分:1)

尝试在控制器中注入$interval

var startInterval = $interval(function(){
  var searchComplete = false;
  var sendGetReq = true;

        sendGetReq = false;  // #1 execution reaches here
        $http.get('/user/getCondition', {params: {condition: $scope.condition}).
        success(function (condition, status, headers, config) {
         if(condition)
         {   searchComplete = true;
            $scope.stopInterval();
         }
         else
         { sendGetReq = true; }
        })

},1000)

$scope.stopInterval = function(){
   $interval.cancel(startInterval)
}

答案 4 :(得分:1)

正如安德鲁所说,它应该是递归的,在你的情况下使用.then。要使其递归,将$ http服务封装在函数

.controller('YourController', function($http) {
this.sendGetReq= function(data) {
    $http.get('/user/getCondition', {params: {condition: data.condition}).
    .then(function(res) {
        if (res.condition) {
        //finish your search
        } else {
        //set newdata somehow   
          this.sendGetReq(newdata);
        }
    }
};

});