关于此Angular ngRx(效果)的建议 – websocket事件怎么样?
所以我正在试验ngrx&通过构建以下沙箱来实现ngrx /效果:
https://stackblitz.com/edit/ngrx-vanilla 快速介绍: >它在app / store中有一个root商店 三页: >行动项目:路由到此页面会触发随机生成三个愚蠢的公司行动项目 问题&背景: >我理解redux中的所有数据更新都是通过操作实现的 收到更新后(在app / store / effects / meeting.effects.ts中说明),将调度新操作. 最后,问题是:让公共服务了解商店是否是一种干净的做法?将一个监听器注册到websocket / firebase实时数据库以便在推送数据时调度操作的最佳位置在哪里? 在这里,我做了一个效果(meeting.effects)对meetingActions.START_MEETING操作类型做出反应,每当推送数据时,都会向商店发送更新订单,但由于我提出的一系列原因,这感觉不对: >难以单独进行单元测试(需要比自身更多的上下文) 这些案件通常如何处理? 解决方法
假设websocket发出不同类型的事件,请将每个事件映射到websocket服务中的不同操作
@Injectable() class WebsocketService{ private socket$:Observable<Action> getActions():Observable<Action>{ if(!this.socket$) { this.socket$= Observable.webSocket(url).pipe( map(functionToMapActions),shareReplay(1) ); } return this.socket$; } } 其中functionToMapActions将webSocket事件映射到动作,我建议最后添加
当你怀疑webService.getActions()时将建立webSocket连接 您可以在@Effects初始化see here中订阅websocket操作 @Effect() init$= this.websocketService.getActions(); 这将在您的应用程序启动后立即发出所有操作(如果在根模块中生效)或者如果模块在延迟加载模块中则加载模块; 或者,如果您对有限的一系列行为感兴趣,您可以这样做 @Effect() init$= this.websocketService.getActions().pipe(filter(filterNeededActionsHere)); 你也可以在这样的特定事件之后开始听动作 @Effect() init$= this.actions$.pipe( ofType('Event which marks start'),swichMapTo(this.websocketService.getActions()) ); 像前面的例子一样,你也可以像以前一样过滤掉这里的行动 希望这能回答你的问题 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |