AngularJS:为什么我不会间隔停止?

时间:2015-08-31 19:32:06

标签: javascript angularjs

我已经阅读了文档,但现在是凌晨3点,我就在结束了。这是我的控制器:

controller('makeDashCtrl', function ($scope, $rootScope, $cookies, $location, $http, $interval) {

    var userId  = $cookies.get('user_id');
    var orgId   = $cookies.get('org_id');

    $http.get('/api/consolidateProfile/').then(function(data){
      console.log(data);
    }, function(res){
      console.log(res + " - Eh, consolidateProfile probably timed out, no biggie")
    })


    var testStart = $interval(function(){
      $http.get('/api/testProgress/' + userId).then(function(obj){

        $scope.message = obj.data.message;
        $scope.sub = obj.data.sub;

        if(obj.data.nextPhase){
          console.log("Should be cancelling...");
          nextScrape();
          $interval.cancel(testStart);  // This one cancels fine
        }
      }, function(err){
        $interval.cancel(testStart);  
      });  
    }, 1000);

    function nextScrape(){

       console.log("In checkScraperadsfsdfads!")
      var checkScraper = $interval(function(){
        console.log("In checkScraper REAL!")
        $http.get('/api/checkScraper/' + userId).then(function(obj){
          var msg = JSON.parse(obj.data);
          console.log("Got some data!")
          console.log(obj);
          if(msg.doneFbs){
            $scope.fbMsg = "We've finished gathering " + msg.doneFbs + " Facebook accounts";
          }

          if(msg.doneTwits){
            $scope.twitMsg = "We've finished gathering " + msg.doneTwits + " Twitter accounts";
          }

          $scope.message = msg.message;
          $scope.sub = msg.sub;


          if(msg.finished){
            $interval.cancel(checkScraper); // This does NOT cancel
            console.log("Scraping Done!")
            $location.path('/dashboard') // This successfully redirects to the next page
          }


        },function(err){
          console.log("There was an error in Checkscraper ")
          console.log(err)
          $interval.cancel(checkScraper);  // This does NOT cancel when there's an error
        });  
      }, 3000)
    }
  })

请参阅上面代码中的注释。也许这是nextScrape()函数中的一个问题,但我不能让$interval取消。即使$location.path()更改为下一页,间隔仍在运行。

我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

我怀疑代码在接收来自Ajax的响应之前正在进行多次调用。这意味着你的ajax需要超过一秒的时间来响应。这种情况正在发生,因为您已经提到了从服务器再次汇集数据的时间非常少。

要停用$interval页面后重定向,您可以在$destroy上使用scope事件。需要手动清除事件,因为在我们分离之前它们不会消失。您可以在离开页面时停止间隔。销毁范围事件

上的事件

<强>代码

$scope.$on('$destroy', function(){
   $interval.cancel(testStart);
})

答案 1 :(得分:1)

如果您的通话需要超过一秒的时间,您可能会一次有多个ajax请求。如果您需要在第一次通话完成时,为什么不拨打一个电话并使用$interval来安排第二次通话,而不是使用$tiemout

function checkProgress() {
  $http.get('/api/testProgress/' + userId).then(function(obj){
    $scope.message = obj.data.message;
    $scope.sub = obj.data.sub;

    if(obj.data.nextPhase){
      // move on to next phase
      nextScrape();
    } else {
      // not done, schedule another check
      $timeout(checkProgress, 1000);
    }
  }, function(err){
    // error, you cancel, but maybe schedule another progress check?
  });  
}