想象一下我们有以下工厂:
@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是正确的情况吗,还是有其他/更好的方法来处理这种可能具有同步和异步时间轴的方法?
答案 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
的实例。