中途派遣行动

时间:2019-04-21 03:21:11

标签: rxjs redux-observable

RxJS的新手。而且可以观察到。

我在尝试在下面的代码中派发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
                    }
                })
            )
        )
    )
)

1 个答案:

答案 0 :(得分:1)

问题似乎出在您的of(takeAction(res, reply))上。具体来说就是.pipe(...)。这是将您的“ takeAction”命令发送到.pipe内部 内的东西,而不是让它“流入”您的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))不是通过 传递到任何内容中的。相反,它被“流”回Redux存储。 merge是一种流出内容的方法,同时可以为动作流创建另一个订阅以临时监听另一个事件。