Javascript 即使组件被销毁,异步过程是否也按预期完成

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

我有一个弹出模式,当用户在模式中单击submit时,它会进入我的数据库并在那里保存一些数据。之后,模式关闭。 但是,由于它是一个模式,用户可以通过ESC按钮关闭它。因此,我想确保即使用户按下ESC,AsiNC仍然完成,而不会在中间被切断。 比如说

// 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。时期