Angular 2 - 等待来自服务的数据init

时间:2017-05-18 14:31:54

标签: angular lazy-loading observable angular2-services angular-services

有2项服务:

  • DataService - 从服务器获取数据
  • CacheService - 订阅 DataService 并保存映射数据

和组件

  • ComponentA - 注入CacheService并具有处理缓存数据的 foo函数

我的问题是 - 当我的 foo函数被调用时,如何确保我的CacheService完成数据。

当前解决方案我有点喜欢,但不确定是否有更好的 Angular 2 方式。完成Rx.Observables

我的解决方案(代码简化):

export class CacheService {
    myData:                IData;
    dataLoadedObservable:  Observable;
    private _emitter:      any;


    constructor(dataService: DataService){
         this.dataLoaded = Observable.create(
            e => {
            _emitter = e;
        });
    }

    private cacheData(){
         this.dataService.loadData().subscribe(data => {
             this.myData = data;
             this._emitter.next('data loaded');
        });
    }
}

ComponentA

export class ComponentA {
    this.cacheService.dataLoadedObservable.subscribe(
            isLoaded => {
                if(isLoaded === 'data loaded'){
                    // Now this.cacheService.myData is ready
                }
            }
        );
}

1 个答案:

答案 0 :(得分:2)

你应该重构这样的数据服务:

export class CacheService {
    private data$:Observable<IData>;

    constructor(private dataService: DataService){
        //We initialize the data Observable.
        this.data$ = new Subject();
        //We load initial data.
        this.dataService.loadData().subscribe(data => {
            //Once the data is loaded, we have to emit its value from our data$ observable.
            this.data$.next(data);
        });
    }

    //getter for our observable.
    public getData():Observable<IData>{
        return this.data$
    }

    //setter for data, hiding the observable logic behind.
    public setData(data:IData){
        this.data$.next(data);
    }
}

这个重构的目标是将数据隐藏在一个可观察的背后。

一个简单的用法是:

cacheService.data.subscribe(data => console.log(data));

在您从中发出数据(使用next()调用)之前,不会调用订阅,这意味着一旦您确实拥有数据,您的订阅就会被调用。