关于$ interval返回的承诺如何与Angular中的$ timeout进行比较的混淆

时间:2014-08-03 00:33:57

标签: angularjs intervals angularjs-service

我有一个问题,了解$ interval返回的承诺如何在Angular中起作用。

让我们说在下面的例子中,我们有一个简单的“api”工厂,它带有一个名为“getStuff”的方法,它返回一个带有一个项目的数组。我们还有一个控制器在该工厂调用$ timeout:

angular.module("app",[])
  .factory('api', function(){
    return {
      getStuff: function() {      
        return ["stuff"];
      } 
    };   
  })
  .controller('appCtrl', function($scope, $timeout, api){
    $timeout(api.getStuff, 1000)
      .then(function(response){
        console.log(response);
      });
  })

这将在1秒后在控制台中记录'[“stuff”]',这很棒。

所以我想说我想通过用$ interval替换$ timeout来每秒调用该方法。现在没有任何反应:

angular.module("app",[])
  .factory('api', function(){
    return {
      getStuff: function() {      
        return ["stuff"];
      } 
    };   
  })
  .controller('appCtrl', function($scope, $interval, api){
    $interval(api.getStuff, 1000)
      .then(function(response){
        console.log(response);
      });
  })

在这种情况下$ timeout和$ interval有什么不同?

我感谢所有人的帮助!

1 个答案:

答案 0 :(得分:4)

$interval返回的承诺唯一能做的就是取消它(停止执行):

var handle = $interval(someFunc, 1000);
...
$interval.cancel(handle);

您的代码应该如下所示:

app.controller('appCtrl', function($scope, $interval, api) {
    $interval(function() {
        console.log(api.getStuff());
    }, 1000);
});

想要看到一切都在一起工作:

app.controller('appCtrl', function($scope, $interval, $timeout, api) {
    var handle = $interval(function() {
        console.log(api.getStuff());
    }, 1000);

    $timeout(function() {
        $interval.cancel(handle);
    }, 5000);
});