2016-08-24 60 views
4

例如,我目前正在調用從Angular 2的HTTP返回的Observable退訂。是否可以將Teardown邏輯添加到已存在的Observable中?

但我有一些自定義邏輯圍繞它。

是否可以將自定義拆卸邏輯添加到已存在的Observable中,如從Angular 2的HTTP返回的邏輯?

沿着Observable.prototype.whenUnsubscribe(customTeardownLogic)行的東西可能嗎?

回答

2

這可能不是正是你想要的,但它可以幫助:

假設你有這樣的事情(從the Hero Guide在角2的網站上得到):

(打字稿)

@Injectable() 
export class HeroService { 
    private heroesUrl = 'api/heroes'; // URL to web API 
    constructor (private http: Http) {} 
    getHeroes(): Observable<Hero[]> { 
    return this.http.get(this.heroesUrl) 
        .map(this.extractData); 
    } 
    private extractData(res: Response) { 
    let body = res.json(); 
    return body.data || { }; 
    } 
} 

// And somewhere else in your code you do: 

let subscription = service.getHeroes().subscribe(... do stuff here); 

// And later on you do: 

subscription.unsubscribe(); 

如果你想添加一些自定義的拆卸邏輯,你可以用自己的包裝Angular 2返回的Observable:

getHeroes(): Observable<Hero[]> { 
    return Observable.create(
     //Let's provide a subscribe function 
     (observer: any) => { 
      const subscription = this.http.get(this.heroesUrl) 
         .map(this.extractData).subscribe(observer); 

      // Now let's return a tear-down/unsubscribe function 
      return() => { 
       subscription.unsubscribe(); 
       this.myTearDownLogic(); 
      } 
     } 
    ); 
2

要回答確切的問題,不,你不能添加拆解邏輯到現有的可觀察

然而,可觀察(您可能會或可能不會擁有控制權)拆卸邏輯和拆卸邏輯的觀察者 - 即,您的訂閱 - 這是你的管理。

這聽起來像你想使用add()方法使用後者拆機邏輯:

anyObservable.subscribe(function() { 

    // my observer code 

}).add(function() { 

    // my teardown logic 

}); 

上面我已經使用拆機邏輯功能表現出來,但訂閱也可以發送,它提供了一個當這個關閉(完成/錯誤)時,可以輕鬆取消訂閱任何數量的其他訂閱。

請注意,如果在添加了拆卸邏輯時observable處於關閉狀態,它將立即執行。

相關問題