角度2可观察重新订阅以重用数据

时间:2016-04-21 02:22:33

标签: angular angular2-services

我正在尝试重用缓存数据。如果没有缓存数据,则使用http获取数据。如果存在缓存数据,则使用observable中的缓存数据。

这是数据服务.ts

import {Injectable} from 'angular2/core';
import {Http, Response, Headers, RequestOptions} from 'angular2/http';
import {Observable} from 'rxjs/Observable';
import {Observer} from 'rxjs/Observer';
import 'rxjs/add/operator/share';

import {Hero} from './hero';
//import {HEROES} from './mock-heroes';


@Injectable()
export class HeroService {
  private _baseUrl: string;
  private _cachedHeroes; 

  private _heroesObserver: Observer<Hero[]>;
  private _heroObserver: Observer<Hero>;
  heroes$: Observable<Hero[]>; 
  hero$:   Observable<Hero>; 
  public _dataStore: { heroes: Hero[], hero: Hero };

  constructor (private http: Http) {
        this._dataStore = { heroes: [], hero: {_id: null, name: null} };
        this.heroes$ = new Observable(observer =>  this._heroesObserver = observer).share();
        this.hero$   = new Observable(observer =>  this._heroObserver = observer).share();
        this._baseUrl = 'http://localhost:8081/api/hero/';  // URL to web api
  }

  loadHeroes() {
      if (this._dataStore.heroes.length === 0) {
        this.http.get(`${this._baseUrl}readAll`)
                 .map(response => response.json()).publishReplay(null,1).refCount()
                 .subscribe(data => {
                                     this._dataStore.heroes = data;
                                     this._heroesObserver.next(this._dataStore.heroes);
                                    }, 
                             error => console.log('Could not load heroes.')
                            );
      }
      else {
       //   Observable.of(this._dataStore.heroes)
       this.heroes$.map(data =>this._dataStore.heroes)
       .publishReplay(null,1).refCount()   
       .subscribe(data => {
                                     this._dataStore.heroes = data;
                                     this._heroesObserver.next(this._dataStore.heroes);
                                     console.log(this.heroes$);
                                    }, 
                             error => console.log('Could not load heroes.')
                            );
      //console.log(this._heroesObserver);          
      }
  }
}

http.get()。map()。subscribe()始终有效。 this._heroesObserver.isUnsubscribed总是显示错误。

但是当缓存数据时,this._heroesObserver.isUnsubscribed总是显示为true。

组件从ngOnInit()

中调用此函数
  ngOnInit() {
    this._heroService.loadHeroes();       
    this.heroes = this._heroService.heroes$;
    this.heroes.subscribe(data => {
                                    data.forEach((h, i) => {
                                        console.log(h); 
                                    });
                                  }, 
                          error => console.log('Could not get hero.')
                         );
  }

这有关系吗?我想不是。 我能做些什么才能让它发挥作用?

更新了要添加.publishReplay(null,1).refCount()的代码。

现在refCount增量和isUnsubscribed始终显示为false。但是,组件仍然无法获取数据。组件中第一次没有缓存数据时,console.log会正确打印所有数据。但是当存在缓存数据时,console.log不会打印任何内容。

1 个答案:

答案 0 :(得分:1)

使用publishReplay(1)将您的observable更改为热记录,该observable将记住并重放最后一个值并将其提供给后期订阅者:

import * as Rx from 'rxjs/Rx';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/publishReplay';

this.heroes$ = http.get(...).map(...).publishReplay(1).refCount();

this.heroes$.subscribe(...);

最后一次重播的值实际上是缓存的值,当发出新的http请求时会被替换