【问题标题】:In AngularUI Router, do unresolved promise leak?在 AngularUI 路由器中,未解决的承诺泄漏吗?
【发布时间】:2014-01-13 17:15:41
【问题描述】:

我正在使用 Angular UI 路由器,我想知道是否有人知道使用 resolve 时未解决的承诺是否会泄漏。我们的用例是,在某些状态下,我们需要做一些检查,然后在原始状态加载之前转换到不同的 url。

我们处理这个问题的方法是在resolve 中使用$location 进行检查并切换url,并留下一个未解决的承诺。未解决的承诺用于阻止加载原始状态的控制器和模板(否则它们会抛出错误)。

所以我的问题是,这种留下未解决的承诺的做法是否会导致泄漏?我意识到另一种选择是设置一个长 $timeout 来解决承诺,但如果没有必要,我想避免它。

【问题讨论】:

    标签: javascript angularjs memory-leaks angular-ui angular-ui-router


    【解决方案1】:

    您需要解决或拒绝该承诺。我建议 URL 切换将在 $stateChangeError 事件侦听器中进行,该事件侦听器会因拒绝承诺而被触发。你可以将reject([data])中你想去的位置传递给监听器。

    http://fiddle.jshell.net/L9jxf/2/

    一些承诺会在超时后拒绝(模拟服务器调用)

            protected: ['$timeout', '$q', function ($timeout, $q) {
                var deferred = $q.defer();
                $timeout(function () {
                    deferred.reject({type:'redirect',location:'401'});
                }, 1000);
                return deferred.promise;
            }]
    

    这会处理拒绝

    app.run(function ($rootScope, $state) {
        $rootScope.$on('$stateChangeError', function (e, to, toParams, from, fromParams, error) {
            if (error.type === 'redirect') {
                $state.transitionTo(error.location);
            }
        });
    });
    

    【讨论】:

      猜你喜欢
      • 2013-12-02
      • 2017-11-24
      • 2019-02-18
      • 2018-07-25
      • 1970-01-01
      • 2015-05-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多