2017-03-21 28 views
2

我有一个弹出式模式,当用户点击模式提交时,它会进入我的数据库并在那里保存一些数据。之后,模式关闭。 但是,由于它是一种模式,用户可以通过ESC按钮关闭它。所以我想要确保即使用户按ESC键,异步仍然完成而不会在中间被切断。即使组件被破坏,异步过程是否完成如期完成

例如。

// 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') 
} 

对于上面的例子,如果我一旦按下ESC键,我点击提交,我从控制台看到

modal Destroyed 

complete 

这表明,预期我的异步调用完成,这是很好。我发现它很奇怪,但是为什么没有Angular 2挂在组件上,直到异步过程完成。 即使组件已被销毁,我的onSubmit函数如何完成(假设这是在调用ngOnDestry()时发生的情况)。在另一种语言如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(); 
       }) 
     }) 
} 
+1

'onSubmit'在请求完成之前很久就完成了。正如你所定义的那样,它是一个消防和遗忘功能。无论您是否关闭模式,都会发生这种情况。在提交通过封闭订阅。了解闭包,了解词法范围,了解JavaScript。如果你不懂JavaScript,你就无法理解TypeScript。期。 –

回答

0

,因为它已经覆盖了各地的堆栈溢出和许多教程网站,等等。我不会谈论JS异步立即关闭模式我只会谈论Observables和订阅管理。

要知道的第一件事情是“它取决于”。这取决于您创建Observable的方式以及您管理订阅的方式。

当您使用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... 

例如,白衣角的Http服务,当你退订它的HTTP请求被取消。

虽然你不退订你的Observable而它不是complete,它仍然在运行,它的组件是否被破坏。

请注意,这是avoid multiple subscriptions的一个好习惯,因为当您必须管理您的订阅时,您不会从使用RxJS中受益。所以最好使用可用的操作符来控制事件的流程。