在AngularUI路由器中,做未解决的promise泄漏?

wli*_*gke 3 javascript memory-leaks angularjs angular-ui angular-ui-router

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

我们处理这个的方式是进行检查并使用$location内部切换url resolve并留下未解决的承诺.未解决的承诺用于防止原始状态的控制器和模板加载(否则它们会抛出错误).

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

The*_*One 8

您需要解决或拒绝承诺.我建议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;
        }]
Run Code Online (Sandbox Code Playgroud)

这可以处理拒绝

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