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