简体   繁体   English

angular2使用Observable(Http)无需重新加载

[英]angular2 work with Observable(Http) without reloading

I have a PartnersService that in constructor load list of partners array from server. 我有一个PartnersService,它在服务器上的合作伙伴数组的构造函数加载列表中。

this.partners = this._http.get('/app/partners/partners.data.json')
            .map(this.extractData)
            .catch(this.handleError);

When I get a list of partners, everything OK. 当我得到合作伙伴列表时,一切正常。 But I need to get partner by ID. 但是我需要通过ID获得伙伴。 In this case, I use function with callback 在这种情况下,我将函数与回调一起使用

getPartner(id:number, callback:(partner:Partner)=>void):void {
    this.partners.subscribe(partners=> {
        for (let partner of partners) {
            if (partner.id == id) {
                callback(partner);
            }
        }
    });
}

In browser console, I see that any time when I call subscribe , angular2 send request to server. 在浏览器控制台中,我看到无论何时我调用subscribe ,angular2将请求发送到服务器。 Can I do something, to not send request any time? 我可以做些什么来不发送请求吗? And maybe exist better way to create getPartner() function(without callback)? 也许存在更好的方法来创建getPartner()函数(不getPartner() )?

You could try something like that: 您可以尝试这样的事情:

getPartners() {
  if (this.partners) {
    return Observable.of(this.partners);
  } else {
    return this._http.get('/app/partners/partners.data.json')
        .map(this.extractData)
        .catch(this.handleError)
        .do(partners => {
          this.partners = partners;
        });
  }
}

getPartner(id:number):Observable<partner> {
  this.getPartners().map(partners => {
    return partners.find(partner => (partner.id == id));
  });
}

And execute the method this way: 并以这种方式执行方法:

this.service.getPartner('some id').subscribe(partner => {
  console.log(partner);
});

You could use publishLast() as well to capture the event. 您也可以使用publishLast()捕获事件。

constructor() {
  this.partners = this._http.get('/app/partners/partners.data.json')
        .map(this.extractData)
        .catch(this.handleError)
        //shares the subscription with all observers so you don't get repeated
        //calls and caches the result.
        .publishLast();
  //Initiates the http call
  this.connection = this.partners.connect();
}

getPartner(id:number):Observable<partner> {

  return this.partners
             //Convert Observable<partner[]> to Observable<partner>
             .flatMap(x => x)
             .filter(p => p.id === id);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM