如何在执行下一个史诗之前确保完成一个史诗?

斯盖姆

这是我们升级到版本后在我们的应用程序中遇到的一个问题,1.x他们引入了在当前堆栈完成后分派epic执行的排队操作(https://github.com/redux-observable/redux-observable/pull /493)。

想象一个动作 ( INIT_STUFF),它有一个史诗,它返回一个动作列表 ( INIT_A, INIT_B, 按照这个顺序)。这些行动中的每一个都有自己的史诗。他们在那里做一些事情并返回一个修改商店的动作。

在以前版本的 redux-observable 中,epic forINIT_B可能依赖于epic forINIT_A已完成执行并对 store 进行更改的事实然后这个史诗可以使用更新的商店。

在最新版本中,史诗的INIT_AINIT_B都按各自的顺序执行,但它们返回的操作(修改存储)被推迟到最后一个史诗完成。这意味着史诗 forINIT_B无法访问由INIT_A.

这是我所说的简单实现:https : //redux-observable-playground-ip3qfb.stackblitz.io

像这样的用例的迁移路径是什么?

杰菲尔普斯

这个确实很棘手。就我个人而言,我认为有两个史诗需要依赖这样的东西将是一种反模式,特别是因为它们都是同步的。我认为这不仅仅是因为它是人为的,否则我认为你不会面临这个问题。

如果 Epic B 真的应该等到 Epic A 准备好才开始,那么父级 (initializeStuffEpic) 应该确保这个序列被强制执行,或者 Epic B 可以监听一些信号来知道 A 准备好了,因为 Epics 是“不应该”泄漏的他们的实现细节是这样的。或者,这可能表明逻辑不应该是两个单独的史诗,而应该是一个,使用函数组合来保持组织有序。

Epics 通常将动作作为它们的信号来响应,尽管第二个参数 ,state$也是一个 Observable 并且也可以订阅。如果您真的更喜欢以这种方式做事,我认为这可能是最简单的方法:

https://stackblitz.com/edit/redux-observable-playground-g1nuis?file=initialize.js

export const initBEpic = (action$, state$) =>
  action$.pipe(
    ofType("INITIALIZE_B"),
    mergeMap(({ payload }) => {
      return state$.pipe(
        filter(state => state.initialized.A), // Wait until it is indeed true
        take(1), // Very important!
        map(() => ({
          type: "IS_B_READY",
          payload: true
        }))
      );
    })
  );

与大多数事情一样,有一些警告。如果 A 从未准备好怎么办?

——

在 redux-observable v1.0 中对操作的调度方式所做的更改旨在使某些事情更直观,同时阻止其他一些不良模式。在那个决定期间没有考虑这个特定的模式,所以我不完全确定我是否会改变行为以使您的用例更容易。虽然不幸的是,看起来很明显的东西不起作用,但它可能是一个可以接受的权衡,因为这是我第一次看到这种情况。

将 Epics 几乎视为独立的进程是有帮助的(尽管它们不是。)如果没有实际信号(操作或 state$ 更新),隐式假设共享状态的时间是不安全的。

我们总是有机会为 v2 更改它,但是有人需要针对特定​​更改提出建议或 PR,并且调度的工作方式——QueueScheduler 的内部实例——有点复杂。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在执行下一个命令之前等待并行命令完成(Shell脚本)

如何在执行下一个之前等待函数完成?

Javascript-确保在执行下一个脚本之前执行一个脚本

如何确保我的异步函数在调用下一个函数之前先执行

如何在执行下一个操作(获取)之前等待所有请求完成

在执行下一个操作之前,如何等待请求完成(Xcode 11)

在React中执行下一个功能之前如何完成所有提取?

如何在下一个功能开始之前等待功能完成?

如何在继续下一个文件之前等待 openRead 函数在一个文件上完成?

确保forEach循环在下一个命令js之前完成

Kotlin-确保在开始下一个操作之前完成收集操作

如何在执行下一个操作之前等待页面加载?

为什么在ngUnsubscribe的“完成”之前“下一个”?

如何在同一个史诗中调度多个动作

在循环中执行下一个HTTP发布之前,请先完成HTTP发布请求

Javascript在执行下一个命令之前不会等待JQuery动画完成

在执行下一个代码之前等待 forkjoin 完成

绅士,一个等待进程完成的 RxJs 计时器,在下一个间隔之前执行

如何确保一个脚本块在下一个块之前先运行?

如何确保仅按下一个键

如何创建一个 redux-observable 史诗,在做任何事情之前等待 2 个动作

如果第一个史诗叫第一部史诗怎么叫?

如何确保执行了SQL语句,然后才开始下一个代码步骤

如何在Angular 6中的for循环中移至下一个索引之前等待完成订阅

iOS - 如何在转到下一个视图控制器之前等待代码完成?

Java流在完成上一个之前开始下一个映射

在调用下一个函数之前,如何等待一个函数完成?

在将下一个都绑定到相同的onclick时,如何确保ajax调用的结果在开始下一个调用之前到达?

在继续下一个之前,如何等待ajax调用完成?