【问题标题】:Stop $timeout update in AngularJS在 AngularJS 中停止 $timeout 更新
【发布时间】:2016-03-24 18:15:55
【问题描述】:

我有 2 个控制器,都使用相同的更新方法来获取数据:

angular.module('project')
  .controller('mainController', function($http, $scope, $timeout, $sce) {
      updateData($http, $scope, $timeout, $sce, false);
  })

  .controller('settingsController', function($http, $scope, $timeout, $sce) {

      updateData($http, $scope, $timeout, $sce, true);          
  })

我的updateData 看起来像这样:

function updateData($http, $scope, $timeout, $sce, settings) {
    $timeout(function() {
        if (settings) {

            getSettings($http, $scope);
        }
        else {
            getDataA($http, $scope);
            getDataB($http, $scope);
        }
        updateData($http, $scope, $timeout, $sce, settings);
    }, 1000);
}

现在刷新主页时(使用mainController)我总是收到“空”消息,因为该过程没有完成所有方法调用,并且当切换到另一个站点时(使用settingsController)加载需要很长时间这是因为必须先完成前一个请求的所有请求。刷新/切换站点时如何直接“杀死”所有待处理的更新?

【问题讨论】:

  • 它的实现不正确..将依赖项作为参数传递给方法是不正确的.. 而方法应该存在于服务中。这样我们就可以向他们索取数据..

标签: javascript angularjs


【解决方案1】:
  1. 这个实现是错误的。我认为将依赖项传递给打开的函数并使用它们不是一个好主意。这可能会产生难以检测的错误。

  2. 您的updateData 函数是资源杀手。它每秒重复一次,没有限制或控制。

您的代码中存在设计问题。您应该重新考虑以标准和有效的方式设计它。

您的问题的答案是 $timeout 返回一个承诺。您可以使用 $timeout.cancel 方法取消超时。

var timeoutPromise = $timeout(foo(), 1000);

$timeour.cancel(timoeoutPromise); 

【讨论】:

    【解决方案2】:

    你应该做一个服务而不是函数。那么你需要将服务注入到控制器中。

    project.service('updateService', function(){
        ...some logic here...
    });
    

    然后注入:

    angular.module('project')
     .controller('mainController', function($http, $scope, $timeout, $sce, updateService) {
            ...use "updateService" methods here...
    })
    

    而当你写一个控制器时,一个小技巧,这样写:

    angular.module('project')
     .controller('someController', ['$scope', function($scope){
    
    }];
    

    当您想要制作代码的缩小版本时,这很重要。

    【讨论】:

    • 所以我将 2 个方法(updateData 和 updateSettings)放在一个服务中,在每个控制器中调用一个,然后在控制器更改/刷新时自动停止执行?
    • @JustSomeDude ,是的,这是正确的做法。它更安全且易于调试。我希望你喜欢我的回答。如果我能以任何其他方式提供帮助,请询问。
    • 我刚刚检查了服务,我想我仍然很困惑,在我看来服务实际上只是一个功能,所以我现在要创建两个服务吗?每个控制器一个(例如 updateSettingsService 和 updateDataService)?
    • 将服务视为逻辑的占位符(或 atlist 这就是我正在做的),几个控制器需要继承。你可以做两个服务并注入两者都很好。如果您喜欢我的回答,请接受。
    • 在我的 getDataA, getDataB 方法中,我直接在 $scope 中设置数据,这就是为什么我通过所有方法传递它的原因,我也在 updateData 本身中调用 updateDate,因此它将每秒执行一次...你介意向我展示一下我的服务会是什么样子吗,我想不通
    猜你喜欢
    • 1970-01-01
    • 2018-06-09
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    • 1970-01-01
    • 2019-09-30
    相关资源
    最近更新 更多