2016-11-29 36 views
1

在指導書角2,它說:處理中的訂閱時觀察到的完成

「可觀察運營商的默認行爲是儘快處置訂閱作爲.complete()或.error()消息請記住,RxJS的設計目的是在大多數時間以「隨意而忘卻」的方式使用。「

在前面的頁面中有一個可觀察和訂閱的例子。

example here

你可以在那裏看到,在3秒後,可見的「.complete()」。但是當再次點擊Init()按鈕並調用init()方法時,用戶仍然被通知。那麼作者意味着什麼 「處置訂閱」

代碼:

import {Component} from '@angular/core'; 
import {Observable} from 'rxjs/Observable'; 

@Component({ 
    selector: 'app', 
    template: ` 
     <b>Angular 2 Component Using Observables!</b> 

     <h6 style="margin-bottom: 0">VALUES:</h6> 
     <div *ngFor="let value of values">- {{ value }}</div> 

     <h6 style="margin-bottom: 0">ERRORs:</h6> 
     <div>Errors: {{anyErrors}}</div> 

     <h6 style="margin-bottom: 0">FINISHED:</h6> 
     <div>Finished: {{ finished }}</div> 

     <button style="margin-top: 2rem;" (click)="init()">Init</button> 
    ` 
}) 
export class MyApp { 

    private data: Observable<Array<number>>; 
    private values: Array<number> = []; 
    private anyErrors: boolean; 
    private finished: boolean; 

    constructor() { 
    } 

    init() { 
     this.data = new Observable(observer => { 
      setTimeout(() => { 
       observer.next(42); 
      }, 1000); 

      setTimeout(() => { 
       observer.next(43); 
      }, 2000); 

      setTimeout(() => { 
       observer.complete(); 
      }, 3000); 
     }); 

     let subscription = this.data.subscribe(
      value => this.values.push(value), 
      error => this.anyErrors = true, 
     () => this.finished = true 
    ); 
    } 

} 

回答

0

這是因爲每次點擊初始時間創建一個新的觀測。試着改變你的線路:

this.data = ... 

if(!this.data){ 
    this.data = ... 

,你會看到的init進一步調用不會調用處理程序

0

移動構造函數中你可觀察到的創建。

您可以在構造函數中包含主題,例如

constructor() { 
    super(); 
    this.data$ = new Rx.Subject(); 
} 

那麼你的點擊處理程序中,你可以這樣做:

this.data.onNext(42)

如果觸發onComplete也可手動你必須檢查流調用onNext

0
前完成

當您在位置或路由器事件等事件上創建訂閱時,訂閱會在組件銷燬後保留現有事件,這可能會導致預先tty很難找到錯誤和不需要的行爲。

當發起http調用時,連接在傳輸成功後關閉,並且您的訂閱將被關閉,因爲可觀察火災完成()。

這是最近我寫的代碼的例子:

ngOnInit(): void { 
    ... 
    this.electionStateSubscription = this.electionState.getState() 
      .subscribe((state: ElectionState) => this.state = state); 
} 

ngOnDestroy(): void { 
    ... 
    this.electionStateSubscription.unsubscribe(); 
} 

在這個例子中都內置樣的狀態商店終極版和我訂閱它在此組件。 electionState始終存在,永遠不會完成。

當這個組件被銷燬時,訂閱是處置。否則,每次組件初始化時都會創建一個新的訂閱,如果沒有其他問題發生,可能會導致性能問題。