2016-09-21 63 views
0

好吧,這是一個快速的,我已經有點疲憊了,並且困惑着我自己:DRxJs - (爲什麼)Observable是否會在新的subsription上發佈它的最新值?

我正在使用angular2和RxJS Observables。

我有一個屬性「數據」,這是獲得在構造函數中設置可觀察到的服務,並返回該觀察的訂閱方法。

export class test{ 
    private data: Observable<Object> 
    constructor(private http: Http){ 
     this.data = this.http.get(url).map(res => res.json()); 
    } 
    getData(): Observable<Object>{ 
     return this.data 
    } 
} 

前段時間,我已經很聰明地回放了一些主題,以便始終將新序列的所有值發送給新的訂閱者。然而,隨着Observable上面的代碼似乎將它發佈給新用戶的最新價值。這是打算?

test(i: number) { 
     if (i > 0) { 
     setTimeout(() => { 
      this.dataService.getData().subscribe((data) => { 
      this.debug.log(data); 
      this.test(i-1); 
      }); 
     }, 2000); 
     } 
    } 
test(4) 

我得到每個迭代的值。我很困惑,因爲一年前,當我想要這種行爲時,在訂閱「太晚」時我沒有任何新的價值。從本質上講,我只想緩存http.get的結果,併爲所有訂閱者提供相同的值,而不是爲每個訂閱創建一個新的http請求(在getData()中返回http.get(url)..) )

+0

請問'this.http.get(url).map(res => res.json()).share()'做你想做的事情嗎? – estus

+0

我很困惑。你說觀察員正在發佈新用戶的最後價值,你似乎並不喜歡。然後你說這就是你想要的。它是什麼? – acdcjunior

+0

對不起,在電話裏,累了,.....是的,它表現了我想要的方式。我只是不確定它是否有意,因爲一年前它沒有這樣工作(或者至少我認爲)。我想我應該再次閱讀觀察對象,當我有時間後 – ch40s

回答

0

號您需要使用Subject這一點。它有一個方法next()你將發送你新到的屬性,以便它推送給用戶。

除此之外,您應該創建一個單身服務。只要你的組件在構造函數中實例化它們,它們就會收到已經與所有數據一起形成的對象。每次都不需要獲取數據。

此外,而不是在構造函數實例化數據,實現OnInit並從那裏做呼叫服務器。

+1

這是一個服務(this.dataService.getData()),因爲我使用ng2 DI它是我的應用程序範圍的單身。由於服務沒有視圖/數據綁定的輸入,我認爲使用構造函數可以嗎? – ch40s

+0

是的,你是對的。 –

1

我知道這個問題有點老,但答案在我看來很混亂。

從方法getData()返回的Observable就是那個,一個Observable。所以每當消費者訂閱它時都會得到迴應。所以它工作正常,但它確實每次都提出新的要求。

爲了緩存結果,有很多方法可以根據你想要的行爲來完成。只是緩存一個請求,我會建議運用互聯網#publishBehavior操作:

export class test{ 
    private data: Observable<Object>; 
    constructor(private http: Http){ 
    this.data = this.http.get(url) 
     .map(res => res.json()) 
     .publishBehavior([]) 
     .refCount(); 
    } 
    getData(): Observable<Object>{ 
    return this.data; 
    } 
} 

傳遞給publishBehavior的參數是初始值。有了這兩個操作員,請求將在第一個用戶到達時進行。下一個訂戶將獲得緩存的答案。

在其他人回答建議使用主題。 publishBehavior在底層使用主題。但要直接調用next(),除非沒有其他補救措施,否則它被認爲是不好的做法,在我看來,這種情況並非如此。即使直接使用Subjects,通過使用#asObservable()運算符將Observable返回給組件也是明智的,因此組件將無法訪問下一個錯誤和完整的方法。

相關問題