Javascript 即使组件被销毁,异步过程是否也按预期完成
我有一个弹出模式,当用户在模式中单击submit时,它会进入我的数据库并在那里保存一些数据。之后,模式关闭。 但是,由于它是一个模式,用户可以通过ESC按钮关闭它。因此,我想确保即使用户按下ESC,AsiNC仍然完成,而不会在中间被切断。 比如说Javascript 即使组件被销毁,异步过程是否也按预期完成,javascript,angular,typescript,closures,lexical-scope,Javascript,Angular,Typescript,Closures,Lexical Scope,我有一个弹出模式,当用户在模式中单击submit时,它会进入我的数据库并在那里保存一些数据。之后,模式关闭。 但是,由于它是一个模式,用户可以通过ESC按钮关闭它。因此,我想确保即使用户按下ESC,AsiNC仍然完成,而不会在中间被切断。 比如说 // from my modal component onSubmit() { this.databaseService.saveToDatabase(data) .first() .subscribe(resu
// from my modal component
onSubmit() {
this.databaseService.saveToDatabase(data)
.first()
.subscribe(result => {
console.log('complete')
closeModal();
}, error => {
console.log(error)
})
}
ngOnDestroy() {
console.log('modal Desstroyed')
}
对于上面的示例,如果我一按submit就按esc,我会从控制台看到
modal Destroyed
complete
这表明我的异步调用按预期完成,这很好。但我觉得很奇怪。。。。。为什么Angular 2在异步进程完成之前不挂起组件。
即使组件已被销毁,onSubmit函数如何完成(假设调用ngondery()时会发生这种情况)。在另一种语言(如Swift)中,视图控制器不会被销毁,除非所有过程都完成(除非您指定它无论如何都被销毁)
另一个我没有测试过的例子。。。如果异步调用长得多,会怎么样。如果我在按下提交按钮后立即关闭模式,是否仍会达到“第二阶段完成”
// from my modal component
onSubmit() {
this.databaseService.saveToDatabase(data)
.first()
.subscribe(result => {
console.log('complete 1st stage')
this.databaseService.saveToDatabase(reult)
.first()
.subscribe(result => {
console.log('2nd stage complete')
closeModal();
})
})
}
我不会谈论JS异步性,因为它已经涵盖了堆栈溢出和许多教程站点等所有内容。我将只讨论可观察对象和订阅管理 首先要知道的是“视情况而定”。这取决于创建
可观察的的方式,以及管理订阅的方式
当您使用Observable.create创建一个Observable时,您可以定义取消订阅时要执行的操作。在本例中,当您取消订阅时,间隔将停止:
let foo = Observable.create((observer)=>{
// this is called when an observer subscribe to this Observable
let interval = setInterval(()=>{
observer.next("foo");
});
// returns what to do on unsubscribe...
return ()=>{
clearInterval(interval);
}
});
let sub = foo.subscribe(data=>console.log(data));
window.setTimeout(()=>sub.unsubscribe(),1000); // passed 1000ms, unsubscribe and cancel the interval...
例如,在angular的Http
服务中,当您取消订阅Http请求时,它将被取消
虽然您没有取消订阅您的可观察的
,而且它也没有完成
,但无论组件是否损坏,它仍在运行
请注意,这是一个很好的实践,因为当您强制管理订阅时,您不会从使用RxJS中获得好处。因此,最好使用可用的运算符来控制事件流。onSubmit
在请求完成之前很长一段时间就立即完成。它是您定义的一个fire-and-forget函数。无论是否关闭模式,都会发生这种情况。在提交时传递一个关闭以订阅。了解闭包、词汇范围、JavaScript。如果不懂JavaScript,则无法理解TypeScript。时期