当一个方法可能会或可能不会异步获取数据时使用哪种RxJS类型?

时间:2018-06-22 15:28:29

标签: javascript angular asynchronous rxjs

想象一下我们有以下工厂:

@Injectable()
export class DataClassFactory {

constructor(
    private dataService: DataService,
) { }

public createThing(initialData?: InitialData): AsyncSubject<DataClass> {
    let dataClass: AsyncSubject<DataClass> = new AsyncSubject<DataClass>();
    if (!!initialData) {
        dataClass.next(new DataClass(initialData));
        dataClass.complete();
    } else {
            this.dataService.getData().subscribe((dataResponse) => {
                dataClass.next(new ReportRequest(dataResponse));
                dataClass.complete();
            });
        }
    }
    return dataClass;
}

}

我们注入了这个工厂,调用createThing方法,并订阅了某些组件中的响应。我最初尝试使用简单的Subject,但是后来我意识到,在我们已经有初始数据的情况下,在返回响应之前调用next(),因此组件中的订户永远不会获得该值。

我的问题是:使用AsyncSubject是正确的情况吗,还是有其他/更好的方法来处理这种可能具有同步和异步时间轴的方法?

1 个答案:

答案 0 :(得分:2)

我会按照这些思路做些事情

public createThing(initialData?: InitialData): Observable<DataClass | ReportRequest> {
    if (!!initialData) {
        const data = new DataClass(initialData);
        return of(data);
    } else {
            return this.dataService.getData()
                           .pipe(map(dataResponse => new ReportRequest(dataResponse));
    }
}

调用createThing的任何人都会得到一个Observable,必须订阅。

如果DataClass不为null,则此Observable将发出initialData的实例,否则将返回ReportRequest的实例,并返回dataService的实例。