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

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

问题描述:

我想重用缓存的数据。如果没有缓存数据,则使用http获取数据。如果有缓存的数据,则使用可观察的缓存数据。角2可观察的重新订阅重用数据

这里是数据service.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()。图()。认购()总是工作。 this._heroesObserver.isUnsubscribe始终显示为false。

但是,当存在缓存的数据时,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总是显示错误。但是,该组件仍然无法获取数据。第一次当组件中没有缓存数据时,console.log会正确打印所有数据。但是,当有缓存的数据时,console.log不会打印任何内容。

使用publishReplay(1)改变你观察到的成热时观察到的,将记住和重播最后一个值,并将其提供给已故用户:

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请求时被替换

+0

我无法找到Observable或Subscriber的connect()方法吗? – Shawn

+0

对不起,我使用的是较旧的API。它应该是publishReplay(),并使用refCount()或connect()。使用refCount()具有一旦所有订户都未订阅就自动处置共享观察值的好处。 – pixelbits

+0

组件仍然无法获取数据?我更新了问题以添加代码和说明。必须有一些我错过的简单东西。 – Shawn