首页 > 解决方案 > 当方法可能异步获取数据时使用哪种 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 方法,并订阅某个组件中的响应。我最初尝试使用普通的主题,但后来我意识到在我们已经有初始数据的情况下,在返回响应之前调用 next(),因此组件中的订阅者永远不会获得该值。

我的问题是:这是使用 AsyncSubject 的正确情况,还是有不同/更好的方法来处理这种具有潜在同步和异步时间线的方法?

标签: javascriptangularasynchronousrxjs

解决方案


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

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。

这个 Observable 会发出一个DataClassifinitialData不为 null 的实例,否则它会在响应时返回和ReportRequest实例dataService


推荐阅读