2017-07-17 62 views
0

我有這樣的觀察到的HTTP請求角 - 可觀察到類似http.get但沒有要求

refreshToken() { 
    return this.http.get(this.siteService.apiDomain() + '/api/token?token=' + localStorage.getItem('JWToken'), {}) 
     .map((response: Response) => { 
      return response; 
     }) 
} 

和我打電話觀察到這樣

return this.refreshTokenService.refreshToken() 
       .flatMap((result: any) => { 
        // if got new access token - retry request 
        if (JSON.parse(result._body).token) { 
         localStorage.setItem('JWToken', JSON.parse(result._body).token); 
        } 
        this.setHeaders(url); 
        return this.request(url, options); 
       }) 

而我的問題是,如果我有多個並行請求我多次使用refreshToken()。我想找到一種方法來做一個假的http調用,並返回我已經知道的或者什麼也不做的令牌。

Observable.empty() // Failed to compile (Type '{}' is not assignable to type 'Response'.) 
Observable.empty().filter(() => {return true}) // Compiles but it stop the flatMap sequence. 

回答

0

我不知道我完全理解,但也許你想Observable.of()

這裏是我使用它的一個例子。如果Id爲0,它將返回一個初始化產品作爲Observable。

import 'rxjs/add/observable/of'; 
... 

getProduct(id: number): Observable<IProduct> { 
    if (id === 0) { 
     return Observable.of(this.initializeProduct()); 
    }; 
    const url = `${this.baseUrl}/${id}`; 
    return this.http.get(url) 
     .map(this.extractData) 
     .do(data => console.log('getProduct: ' + JSON.stringify(data))) 
     .catch(this.handleError); 
} 
0

我會建議使用BehaviourSubjects的,它可以讓你存儲的最後一個值,直到該組件銷燬或你面對它改變。此外,當BehaviourSubject上的值發生更改時;每個訂閱了它的組件都會收到新的數據。另外作爲一個額外的好處,你不需要調用服務器evrytime組件想要獲得像Observable這樣的值,因爲它存儲的值,你可以隨時獲得該值,而無需調用服務器。 BehaviourSebject example