2017-03-21 87 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中受益。所以最好使用可用的操作符來控制事件的流程。