2017-07-31 237 views
3

我正在製作一個Angular 4應用程序。組件正在訂閱Observable。有時Observable調用相同的URL。例如,在任何http請求之前,如果需要刷新Access Token。但是如果我做出不同的3個http請求,它會刷新令牌的3倍。如何使用RxJs處理/排隊多個相同的http請求?

那麼如何讓只有一個http得到一個刷新的訪問令牌,並讓其他的可觀察對象等待第一個呢? (我知道'等待'不是Observables的好詞)。

 public get(url: string, options?: RequestOptionsArgs): Observable<Response> { 
      return this.getAccessToken().mergeMap(accessToken => { 
       return this.http.get(url, options); 
      }); 
      } 

//而

this.get('www.myapi.com/one').subscribe(data=>console.log('one',data)) 
this.get('www.myapi.com/two').subscribe(data=>console.log('two',data)) 
this.get('www.myapi.com/three').subscribe(data=>console.log('three,data)) 
+0

爲什麼不打電話給其中的第一個 –

+0

訂閱的其他observables因爲我不知道哪一個將被稱爲或不。這不是很正常。 – Stefdelec

回答

3

好像你可以使用share()操作,使得確保有永遠只有一個訂閱源觀測。

然而,這將需要你調整你的代碼,因爲所有的觀察者需要使用share()相同的實例:

const sharedToken = this.getAccessToken().share(); 

public get(url: string, options?: RequestOptionsArgs): Observable<Response> { 
    return sharedToken.mergeMap(accessToken => { 
    return this.http.get(url, options); 
    }); 
} 
+0

謝謝。如果我們想象我們想將一個參數傳遞給'''this.getAccessToken'''? – Stefdelec

0

者使用的操作稱爲forkJoin。如果您熟悉Promise,這與Promise.all()非常相似。 forkJoin()運算符允許我們獲取Observable列表並並行執行它們。一次在列表中可觀察到發射值forkJoin與發射包含在列表中

請到通過下面的例子從觀測量所有解析值的列表中的單一可觀察值:

進口:

import { Observable } from 'rxjs/Observable'; 
import 'rxjs/add/observable/forkJoin'; 

讓假設,你必須得到

三頁
var pages:number[] = [1, 2, 3]; 

或者var pages:number[]=new Array(10).fill().map((v,i)=>i+1);

,然後將它們映射到觀測陣列和forkJoin

Observable.forkJoin(
    pages.map(
     i => this.http.get('www.myapi.com/' + i) 
     .map(res => res.json()) 
    ) 
).subscribe(people => this.people = people); 

請到StackforkJoin獲取更多信息。