Ngrx中的效果可以不订阅可观察的动作吗?

时间:2020-10-13 12:37:23

标签: angular ngrx ngrx-effects

我有一个简单的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有所了解。

1 个答案:

答案 0 :(得分:0)

虽然您可以以这种方式使用副作用,但我认为这不是正确的模式。副作用只是在分派动作时应该发生的事情,而不是与状态的交互。从定义上讲,它们是动作的副作用。

我想说的是,您在此处创建的行为应确实在服务中实现,因为它不是由操作触发的。您的服务将订阅WebSocket,然后在每次套接字发出时调度操作。