如何正确使用可能已被销毁的范围

时间:2015-01-30 08:05:53

标签: javascript angularjs asynchronous angularjs-scope lifecycle

我有很多像这样的代码:

app.directive(... function(...) { return function($scope...) {
    // add utilties like safeApply, handleError etc.
    decorateScope($scope);

    /**
     * Starts some-XXXX request that will run in the background for a while
     */
    $scope.doSomething = function() {
        someService.doSomethingThatTakesAWhile(...)
        .then(function(result) {
            // success!
            $scope...                               // DANGER!
        })
        .finally(function(result) {
            $scope.$apply();                        // DANGER!
        })
        .catch($scope.handleError.bind($scope));    // DANGER!
    };
};});

标有DANGER!的三行有一个可怕的谬误:当服务完成所请求的操作时,$scope可能已被销毁(例如因为它是页面的一部分而不是再次激活;我的页面系统使用ng-if等),对被破坏的$scope进行操作肯定不是一个好主意。

这种混乱中是否存在一种角色?

0 个答案:

没有答案