Javascript 如何正确处理可能已销毁的作用域

Javascript 如何正确处理可能已销毁的作用域,javascript,angularjs,asynchronous,angularjs-scope,lifecycle,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 */

我有很多这样的代码:

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!
    };
};});
三条标有危险的线!有一个可怕的谬误:当服务完成请求的操作时,$scope可能已经被破坏,例如,因为它是不再活动的页面的一部分;我的页面系统使用ng if等,在销毁的$scope上操作肯定不是一个好主意


有没有办法摆脱这种混乱局面?

哇,有几件事突然向我袭来。首先,我可能会找到一种使用$q来推迟那些长时间运行的任务的方法。除此之外,这是指令中隔离作用域的理想用例。@AndrewCounts他们已经在使用承诺。虽然大家同意,但这里的问题是,你直接修改了别人的范围——这是在转移责任。要么将调用移到服务,要么尝试将逻辑移到一个独立的作用域-这样,拥有$scope的人就可以真正负责它消失后发生的事情。@RGraham拥有该作用域的人是谁?这在指令的链接函数中。没有比这更接近范围的了?你是说,我应该在“销毁”中添加$scope.$on,。。。设置$scope=null;在link函数中,并在每次使用前添加空检查?或者你是说把这段代码移到别的地方可以解决这个问题?我不知道$scope是指令的范围。您可以拒绝销毁范围的承诺:$scope.$ondestroy,dosomethingthatasawhile.rejectdestroy;并以特殊方式处理拒绝。ifresult!==销毁{$scope.doStuff;}@RGraham这似乎比在销毁时直接将$scope置空要复杂得多?我认为ng if是对Angular。。。也许他们会在不久的将来想出更好的策略,或者当Angular 2.0到来时,它可能会被搁置一旁:P