NGRX Effects中@Effect返回Observable无需subscribe即可触发Action的疑问
核心原因
NGRX Effects 库内部已经自动完成了所有被 @Effect() 装饰器标记的 Observable 流的订阅逻辑,不需要开发者手动调用 subscribe。
具体原理说明
@Effect()装饰器的核心作用是收集你声明的 Effect 流(也就是你代码里的loadProjects$)到 Effects 全局注册中心。当你在项目中引入 EffectsModule 并注册对应 Effect 类时,库会在初始化阶段统一订阅所有注册的 Effect 流。- 你代码里的
dataPersistence.fetch方法返回的 Observable 本身会先订阅 NGRX 全局的 Action 流:每当全局派发的 Action 匹配到ProjectsActionTypes.LoadProjects类型时,就会自动触发你传入的run回调函数。 run回调里你返回的this.projectsService.all()对应的请求 Observable,会被 NGRX Effects 内部自动订阅,请求返回结果后,库会自动把你 return 的ProjectsLoaded实例作为新的 Action 派发到全局 Store 中,整个订阅、派发逻辑都被框架封装好了。- 你传入的
onError回调也是框架在内部捕获到流异常时自动触发的,不需要你额外做异常捕获和处理。
和普通 Observable 的区别
你写的普通 Observable 没有上层框架帮你做自动订阅逻辑,所以必须手动调用 subscribe 才会触发流的执行;而在 NGRX Effects 的场景下,框架已经把订阅、异常处理、Action 派发这些通用逻辑都做了封装,你只需要声明流的业务逻辑即可。
注意:不要手动给被
@Effect()标记的 Observable 调用subscribe,否则会导致同一份逻辑被重复执行,还可能引发内存泄漏问题。
内容的提问来源于stack exchange,提问作者Hssan Bouzlima
相关产品推荐
相关产品推荐

