【问题标题】:Await the asynchronous dispatch of an action in redux-observable在 redux-observable 中等待 action 的异步调度
【发布时间】:2019-02-01 06:18:14
【问题描述】:

我有一个史诗,它调度一个由 redux 中间件处理的动作,一旦动作被调度,它就会返回一个承诺。史诗大概是这样的:

const myEpic = action$ =>
  action$.pipe(
    ofType(SAVE_ACTION),
    switchMap(action => [
      saveData(action.payload)
    ])
) 

SAVE_ACTION 被调度时,它被epic 拾取,调度由saveAction 动作创建者创建的动作。

这个产生的动作被redux中间件(特别是redux-axios-middleware)截获,该中间件发出一个HTTP请求并将分派这种动作的结果转换为一个promise,它具有在HTTP请求成功时解析的标准行为,并且HTTP 请求失败时拒绝。

一旦承诺得到解决,我需要做的就是在这个史诗中做额外的工作,因为我需要包含在初始 SAVE_ACTION 操作的负载和 HTTP 响应的负载中的数据。

因为中间件还会在底层 HTTP 请求完成时调度操作,所以很容易编写一个额外的史诗来完成我需要在一个独特的史诗中完成的额外工作,但我无法访问有效负载不再是最初的SAVE_ACTION,所以我试图弄清楚这是否可以在一个史诗中全部处理,但到目前为止我还没有找到方法。我发现了像 this one 这样的在线帖子,它提供了很多信息,但仍然没有解决等待动作发送的问题,而不是一个普通的 observable。

【问题讨论】:

  • 为什么你会有第二个中间件来处理你的 Ajax 调用,为什么不在redux-observable 中处理它们?
  • 您必须询问原始代码的作者@Anas :) 让我们假设这样的史诗比使用不同的方法触发 HTTP 请求更值得更改

标签: redux redux-observable


【解决方案1】:

一种方法是像这样使用合并:

 import { merge } from 'rxjs/observable/merge';

 const myEpic = action$ => {
     let initialPayload = null;      

     return merge(
         action$.pipe(
             ofType(SAVE_ACTION),
             switchMap(action => {
                 initialPayload = action.payload;

                 return [saveData(action.payload)]
             })
         ),

         action$.pipe(
             ofType(SAVE_ACTION_SUCCESS),
             mergeMap(action => {
                 // Use initialPayload here.
             })
         ),
    )
}

【讨论】:

  • 有趣的想法。我检查了它,但我很快发现这仍然无法让我在第二个action$.pipe 中访问SAVE_ACTION 的有效负载
  • @Simone 抱歉忘记了,修改了代码。这并不理想,但应该可以。
  • 我不确定使用可变状态在两个可观察对象之间共享数据是一种安全的方法。例如,可能有另一个SAVE_ACTION 进来,而第一个SAVE_ACTION_SUCCESS 尚未被发送。我认为你基本上失去了对流程的控制
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 2019-04-25
  • 2018-03-26
  • 2023-04-03
  • 1970-01-01
  • 2020-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多