ngrx 中的效果不能订阅可观察的动作吗?
Can an effect in ngrx not subscribe to actions observable?
我有一个公开 webSocketSubject 的简单 angular10 服务,请参阅以下代码:
@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 有一个全面的了解。
虽然您可以以这种方式使用副作用,但我认为这不是正确的模式。副作用只是在调度不与状态交互的动作时应该发生的事情。根据定义,它们是操作的副作用。
我想说的是,您在此处创建的行为实际上应该在服务中实现,因为它不是由操作触发的。您的服务将订阅 WebSocket,然后在每次套接字发出时分派操作。
我有一个公开 webSocketSubject 的简单 angular10 服务,请参阅以下代码:
@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 有一个全面的了解。
虽然您可以以这种方式使用副作用,但我认为这不是正确的模式。副作用只是在调度不与状态交互的动作时应该发生的事情。根据定义,它们是操作的副作用。
我想说的是,您在此处创建的行为实际上应该在服务中实现,因为它不是由操作触发的。您的服务将订阅 WebSocket,然后在每次套接字发出时分派操作。