RxJS是同步执行的吗?如下写法在任何场景下都无法正常返回结果吗?
代码存在的核心问题
这个写法绝大多数场景下都无法稳定运行,你的认知没有问题,这是典型的把异步逻辑和同步返回混用的错误写法:
- 普通场景下,
subscribe的回调函数只会在Observable发射值时才会异步执行,而这个getter是同步执行逻辑,return convertedView会在订阅回调触发前就执行,最终返回的永远是初始值null。 - 仅有一种极端特例下它可能“看起来正常工作”:
fromStore.getTransferOrderConverted对应的是同步发射值的Observable(比如自带初始缓存的BehaviorSubject、of()构造的冷同步流),此时take(1)会同步触发订阅回调,赋值操作会在return语句执行前完成。但这种写法完全依赖流的内部实现,属于典型的巧合编程,没有任何稳定性可言,只要后续流的逻辑调整为异步(比如新增接口请求、加了delay之类的异步操作符),代码会立刻失效且问题难以排查。
推荐的修正方案
根据业务场景可以选两种常见的正确实现:
- 直接返回Observable,调用方自行订阅或者配合框架的异步管道消费(比如Angular的
async管道):
protected get reportView(): Observable<any> { return this.store.pipe(select(fromStore.getTransferOrderConverted), rxjs.take(1)); }
- 改造为异步方法,把Observable转为Promise使用async/await消费:
// RxJS 7+ 推荐用 firstValueFrom 替代废弃的 toPromise protected async getReportView(): Promise<any> { return firstValueFrom(this.store.pipe(select(fromStore.getTransferOrderConverted))); }
内容的提问来源于stack exchange,提问作者Ricardo Saracino
相关产品推荐
相关产品推荐

