2017-05-27 43 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); 
     } 
    } 
}