我有一个简单的angular 10服务,它公开了一个webSocketSubject,请参见以下代码:
@Injectable({
providedIn: 'root'
})
export class WebsocketService implements OnDestroy {
private webSocketSubj : WebSocketSubject<User> //| Observable<Error>
constructor() {
this.webSocketSubj = webSocket("<some_url>")
}
ngOnDestroy(): void {
this.webSocketSubj.complete()
}
getWebSocketSubject(): WebSocketSubject<User> {
return this.webSocketSubj
}
}
然后将服务注入到一个效果中,该效果在每次websocket上有新数据可用时调度一个更新操作。为此,我不需要订阅可观察的动作。这里是一些示例代码:
@Injectable()
export class EffectEffects {
effect = createEffect(
// Next line subscribe to my websocket subject, but not to the actions
() => this.service.getWebSocketSubject().pipe(
map(user => {
return { type: '[Actions] Load Actionss Success', ...user }
})
)
)
constructor(private actions$: Actions, private service: WebsocketServiceService) {
}
}
该代码似乎可以正常工作,但是我对效果的理解是,它们必须听每个动作并调度另一个动作,例如example。
如果我的代码存在问题或缺点,有人可以向我解释吗?
在此先感谢所有提示,我只想对ngrx和rxjs有所了解。
答案 0 :(得分:0)
虽然您可以以这种方式使用副作用,但我认为这不是正确的模式。副作用只是在分派动作时应该发生的事情,而不是与状态的交互。从定义上讲,它们是动作的副作用。
我想说的是,您在此处创建的行为应确实在服务中实现,因为它不是由操作触发的。您的服务将订阅WebSocket,然后在每次套接字发出时调度操作。