2017-05-27 42 views
0

我想限制在我的應用程序中不必要的HTTP調用的數量,但每次我訂閱Observable時都會向服務器發出請求。有沒有辦法訂閱一個observable而不發起http請求?我在服務觀察到看起來像這樣:Angular4 Rxjs可觀察限制後端HTTP請求

getServices(): Observable<Service[]> { 
    return this.http.get(this.serviceUrl).map(res => res.json())._catch(err => err); 
} 

然後在我的部分我訂閱的觀察到的是這樣的:

this.serviceService.getServices().subscribe(services => this.services = services);

我想實現的就是以某種方式存儲的業務數據(這樣我就可以在整個應用程序中使用這些數據,而不需要分別在每個組件上提出請求,但是我也想知道組件何時收到這些數據(我通常通過訂閱的方式收到這些數據)

+0

...只是不要調用觸發請求的函數? <。<爲什麼你會訂閱它,如果你不想它運行?沒有任何意義。 – Chrillewoodz

+0

我訂閱它,因爲我想要它提供的相同數據...現在我創建了一個解決方法,並將「this.services」放入主題中,並在sbuject之外創建了一個observable。 –

+0

這已經在這裏很好地描述:https://stackoverflow.com/documentation/rxjs/8247/common-recipes/26490/caching-http-responses#t=201705280824475411303 – martin

回答

0

不知道我是否正確理解你的問題,但似乎你想緩存服務中第一個HTTP請求的結果,所以如果第一個組件獲取數據,第二個(另一個訂戶)將檢索緩存的數據。如果是這種情況,請在模塊級別聲明服務提供者,以便Angular創建一個單例對象。然後在服務內部創建一個var,它在第一次檢索後存儲數據。

@Injectable() 
export class DataService{ 

    mydata: Array<string>[]; 

    constructor(private http:Http){} 

    getServices(): Observable<string[]> { 
     if (this.mydata){ 
      return Observable.from(this.mydata); // return from cache 
     } else 
     { 
      return return this.http.get(this.serviceUrl).map(res => res.json())._catch(err => err); 
     } 
    } 
}