派遣行动中途

Dispatch action midstream

RxJS 的新手。和 redux-observable.

我遇到了问题我正在尝试在下面的代码中发送一个动作中游 of(takeAction()),然后听取来自此的响应动作,RESOLVE_TAKE 类型或 REJECT_TAKE 类型。但是我的 of(takeAction) 没有触发,有人知道如何修复下面的代码吗?

除了这个问题,还有一个额外的好处:任何关于如何重构我的代码的风格建议,我不确定它是否是最干净、最易读的方式。我正在做一个获取,然后在不同的状态代码上进行 switch,然后获取 res(获取的响应)和 reply,并在可能的情况下回复 json ,然后将 resreply 作为参数传递给 takeAction。然后等待 takeAction 管道发送 RESOLVE_TAKEREJECT_TAKE.

action$.pipe(
    ofType(START_FOO),
    switchMap({ url } =>
        from(fetch(url)).pipe(
            mergeMap(res => from(res.text()).pipe(
                mergeMap(reply => {
                    try { reply = JSON.parse(reply) } catch(ignore) {}
                    switch (res.status) {
                        case 200: {
                            return of(takeAction(res, reply)).pipe( // not dispatching
                                action$.pipe(
                                    ofType(RESOLVE_TAKE, REJECT_TAKE),
                                    mergeMap(({ type }) => {
                                        if (type === RESOLVE_TAKE) {
                                            return of(resolveFooAction())
                                        } else {
                                            return of(rejectFooAction())
                                        }
                                    })
                                )
                            )
                        }
                        // other res.status cases go here
                    }
                })
            )
        )
    )
)

问题似乎出在您的 of(takeAction(res, reply)) 上。具体来说,它是 .pipe(...)。那就是将你的 "takeAction" 命令发送到 inside .pipe 的东西,而不是让它 "flow" 到你的 Redux 商店。也许像下面这样的东西会更好:

action$.pipe(
  ofType(START_FOO),
  switchMap({ url } =>
    from(fetch(url)).pipe(
      mergeMap(res => from(res.text()).pipe(
        mergeMap(reply => {
          try {
            reply = JSON.parse(reply)
          } catch (ignore) {
          }

          switch (res.status) {
            case 200: {
              return merge(
                of(takeAction(res, reply)),
                action$.pipe(
                  ofType(RESOLVE_TAKE, REJECT_TAKE),
                  map(({ type }) => {
                    if (type === RESOLVE_TAKE) {
                      return resolveFooAction()
                    } else {
                      return rejectFooAction()
                    }
                  }),
                ),
              )
            }
            // other res.status cases go here
          }
        })
      )
    )
  )
)

在上面,of(takeAction(res, reply)) 不是 管道到任何东西。相反,它正在 "flowed" 返回到 Redux 商店。 merge 是一种流出内容的方法,同时创建另一个对操作流的订阅以临时监听另一个事件。