使用 Redux Observable 等待操作序列

2024-04-05

我有一个用例,在使用 Redux Observables 调度另一个操作之前,我需要等待一系列操作。我见过一些类似的问题,但我无法理解如何在给定的用例中使用这些方法。

本质上我想做这样的事情:

action$
  .ofType(PAGINATION_CLICKED) // This action occurred.
  .ofType(FETCH_SUCCESS) // Then this action occurred after.
  .map(() => analyticsAction()); // Dispatch analytics.

如果有其他类型的操作,我还想取消并重新开始该序列FETCH_ERROR例如火灾。


很好的问题。重要的一点是action$是调度所有操作时的热/多播流(它是一个主题)。由于天气很热,我们可以多次组合它,他们都会听到相同的动作流。

// uses switchMap so if another PAGINATION_CLICKED comes in
// before FETCH_SUCCESS we start over

action$
  .ofType(PAGINATION_CLICKED)
  .switchMap(() =>
    action$.ofType(FETCH_SUCCESS)
      .take(1) // <-------------------- very important!
      .map(() => analyticsAction())
      .takeUntil(action$.ofType(FETCH_ERROR))
  );

所以每次我们收到PAGINATION_CLICKED我们将开始监听内部 Observable 链,该链监听单个FETCH_SUCCESS。拥有它很重要.take(1)因为否则我们会继续听不止一个FETCH_SUCCESS这可能会导致奇怪的错误,即使不是,通常最好的做法是只采用您需要的内容。

We use takeUntil取消等待FETCH_SUCCESS如果我们收到FETCH_ERROR first.


作为奖励,如果您决定也想根据错误进行一些分析,不仅可以重新开始,还可以使用race确实在两条溪流之间进行比赛。第一个发出的为胜;另一个已取消订阅。

action$
  .ofType(PAGINATION_CLICKED)
  .switchMap(() =>
    Observable.race(
      action$.ofType(FETCH_SUCCESS)
        .take(1)
        .map(() => analyticsAction()),
      action$.ofType(FETCH_ERROR)
        .take(1)
        .map(() => someOtherAnalyticsAction())
    )
  );

这是同样的事情,但是使用race作为实例运算符而不是静态运算符。这是您可以选择的风格偏好。他们都做同样的事情。使用您更清楚的一种。

action$
  .ofType(PAGINATION_CLICKED)
  .switchMap(() =>
    action$.ofType(FETCH_SUCCESS)
      .map(() => analyticsAction())
      .race(
        action$.ofType(FETCH_ERROR)
          .map(() => someOtherAnalyticsAction())
      )
      .take(1)
  );
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Redux Observable 等待操作序列 的相关文章

  • axios catch 没有捕获错误

    我在用着axios 0 17 0使用以下代码 this props userSignupRequest this state then res gt console log res data catch err gt this setSta
  • 将函数从纯 React 转换为 Redux React

    在纯反应中 我编写了一个调用的函数componentDidMount getTasks userId query statusTask pageNumber gt let check axios url api v1 beta userId
  • React-ReduxReducers 中 Spread 语法的用途

    我试图理解扩展运算符的目的 根据我从文档中了解到的 扩展语法会复制现有对象 并在传入新对象时被覆盖 在下面的代码中 export default function reducer state user fetching false fetc
  • 如何通过模拟选择器和/或 redux 存储来编写 Redux Saga 测试

    Context 我是编写 Redux Saga 测试的新手 并且一直在使用反应样板 https github com react boilerplate开发一个应用程序 该应用程序使用 Jest 进行测试 样板文件非常模块化且复杂 我什至不
  • React 组件安装两次

    在我的 React Redux ReactRouterV4 应用程序的一小部分中 我有以下组件层次结构 Exhibit Parent ExhibitOne ExhibitTwo ExhibitThree 在 Exhibit 的子级中 还可以
  • 如何在redux减速器中更新二维数组中的值?

    我正在尝试更新索引处的值 i j 在 redux 减速器中使用展开运算符在 2D 数组中 我的减速器看起来像 export default state action gt switch action type case INSERT ret
  • 将参数传递给mapDispatchToProps()

    我不能撒谎 我对 React Redux 有点困惑 我认为很多操作都需要参数 例如从商店中删除项目 但即使我仍在阅读如何以这种方式从组件分派来传递参数 现在大约 2 小时 我没有得到任何答案 我被尝试过this props dispatch
  • 使用 Jest 和 Redux 的异步组件快照

    我发现 Jest 在测试我的 Redux React 应用程序时非常有用 然而 有很多关于如何测试异步操作创建器的示例 但我无法真正弄清楚如何对异步组件进行快照 我想做的是类似的事情Facebook 自己的教程中的悬停链接示例 https
  • React/redux - 将 actionCreators 传递到多个深度级别

    我想知道其他人如何处理将 redux 动作创建者从智能顶级组件传递到许多较低级别的哑组件而不膨胀其 props 定义 例如 以下这个关于 redux 的优秀教程 http teropa info blog 2015 09 10 full s
  • 将 props 传递给 React-Redux 容器组件

    我有一个在 React Native Navigator 组件中创建的 React Redux 容器组件 我希望能够将导航器作为道具传递给该容器组件 以便在其演示组件内按下按钮后 它可以将对象推送到导航器堆栈上 我想做到这一点 而不需要手动
  • 卸载后取消 Redux 操作

    我想在组件卸载后取消一些功能 因为它会导致内存泄漏我的代码如下所示 componentDidUpdate prevProps if prevProps org org this props org org this mounted this
  • Redux 不就是美化了全局状态吗?

    所以我一周前开始学习 React 我不可避免地遇到了状态问题以及组件应该如何与应用程序的其余部分进行通信 我四处搜寻了一下 Redux 似乎是这个月的热门 我通读了所有文档 我认为这实际上是一个相当革命性的想法 以下是我的想法 人们普遍认为
  • 测试 React Redux - 无法读取未定义的属性或未定义的包装器

    我在为我的测试套件在组件中设置 Redux 存储时遇到了一些问题 问题是 即使我尝试未连接的挂载 测试也会在 authState 中查找变量时抛出错误 我有以下组件 import React Component from react imp
  • 为什么express服务器接收到的前端数据是未定义的?

    我目前正在开发社交媒体 Mern Stack React 应用程序 我使用 Node js 和 Express 作为我的后端服务 还使用 mongoose 来存储我的数据 并使用 axios 和 redux thunk 将后端连接到前端 到
  • 如何在 redux-toolkit 中正确使用 PayloadAction 和元类型?

    简化示例 import createSlice PayloadAction from reduxjs toolkit type Cake flavor string size S M L const initialState all Cak
  • React 中模型更改 11 次后 Froala 编辑器崩溃

    我在没有身份的情况下在线构建了一个简单的编辑器 在后端实现Node JS 与 Socket IO MongoDB 以及客户端使用React连接Socket IO 为了创建编辑器 我使用了弗罗拉编辑 https www froala com
  • 当react-redux中redux存储的非相关部分更新时组件重新渲染

    我注意到我的一些组件在我不期望的情况下重新渲染 可以说我有一个
  • 如何将 setTimeout 添加到使用 redux 的 fetch Promise 中?

    经过一定的秒数后 如果获取承诺尚未得到解决 我想向用户显示超时错误 我在这里看到了一些添加 setTimeout 来获取的很好的例子 https github com github fetch issues 175 https github
  • React-Redux:绑定按键操作以启动减速器序列的规范方法是什么?

    这是一个关于react redux的新手问题 我花了几个小时四处搜寻才发现 所以我发布了这个问题 然后为后代回答 也可能是代码审查 我正在使用 React Redux 创建一个游戏 我想使用 WASD 键在小地图上移动角色 这只是更大努力的
  • Redux 减速器的副作用

    Redux 减速器应该没有副作用 但是 如果某个操作应该触发浏览器中文件的下载 其中内容基于商店的状态 该怎么办 这当然应该算作副作用吗 像下面这样的方法可以吗 还是我应该寻找替代方法 case SAVE GRID const json s

随机推荐

  • 缺少 Perl 依赖项实际上并未丢失

    我正在尝试在 Amazon Web Services 的 EC2 实例上安装 OTRS Help Desk 我正在按照安装说明进行操作here http otrs github io doc manual admin stable en h
  • 谁负责下一个视图?

    在典型的 MVC 架构中 决定接下来显示哪个视图的逻辑在哪里 假设是某种具有多个视图 窗口 的应用程序 这些视图在不同时间可能可见或不可见 具体取决于用户操作 例如 有时应用程序可能需要用户填写包含其他详细信息的表单 有时则可能不需要 控制
  • 将 Types.NVARCHAR 与 Oracle JDBC 驱动程序结合使用来处理西里尔字符

    我正在尝试使用 JDK 1 6 中国家字符集类型数据的新方法 http download oracle com docs cd B28359 01 java 111 b31224 global htm BABJFAGA 得到一个标准的JDB
  • Flutter:获取视频第一帧

    Flutter项目中如何获取本地视频文件的第一帧 这是我的代码 ImagePicker pickVideo source ImageSource camera then File file if file null mounted I go
  • 如何使用 Visual Studio 代码在 ASP.NET Core 中添加 ASP.NET 身份

    这是我在 ASP NET Core 中的第一个项目 现在我需要在 Visual Studio 代码中为核心 MVC 应用程序实现 ASP NET 身份 我查了一下 但在 Microsoft 网站上找不到任何博客和文档来说明如何做到这一点 如
  • 如何安装imap客户端

    我正在尝试使用 IMAP 客户端库 https imapclient readthedocs org en stable https imapclient readthedocs org en stable 我下载了zip https py
  • `viewDidLayoutSubviews` 中的框架计算

    首先 我应该提到 这主要是一个效率问题 关于在哪里进行框架计算有很多讨论viewWillAppear太早了并且viewDidAppear太晚了 视图已经可见 常见的答案是进行帧计算viewDidLayoutSubviews 问题是 它被多次
  • Silverlight:如何禁用浏览器的刷新按钮?

    我正在开发一个 Silverlight 应用程序 即根本没有 HTML 内容 最大的抱怨之一是如果用户不小心按了 F5 应用程序就会重新启动 那么有什么办法可以禁用浏览器中的 刷新 按钮吗 或者至少处理F5 这里有几个选项 http for
  • Twitter 客户端中的自动链接@提及

    我正在构建一个基本的 Twitter 客户端应用程序 我正在尝试弄清楚如何使保存推文的 TextView 自动链接 提及 以便它们链接到任何人的 Twitter 页面 就像在 Twitter 网站上一样 我的猜测是 这将涉及制作一个自定义
  • 使用 Python evdev 模拟按住控制器 dpad 按钮

    我正在尝试使用 Python evdev 模拟按住控制器上的 DPad 按钮 到目前为止 我已经成功按下一个按钮 如下所示 import os import time from evdev import uinput ecodes as e
  • Active Records 按 ID 排序[重复]

    这个问题在这里已经有答案了 如果我有 id 为 1 2 3 4 的记录 并且想要以某种方式对它们进行排序 例如 1 4 2 3 我该怎么做 我想类似的东西 但它当然行不通 Service all order id 1 4 2 3 贾斯汀 韦
  • JVM 在 OutOfMemoryError 之后是否自行终止 [重复]

    这个问题在这里已经有答案了 发生 OutOfMemoryError 后 JVM 会自行终止吗 如果不是那么为什么 它会尝试收回资源吗 还是有其他原因 OutOfMemoryError 不会终止 JVM 如果它未被捕获 它将终止引发错误的线程
  • angularjs 获取表单操作并提交给它

    我有一个表单 我想捕获它的提交 检查数据的验证 然后将表单提交到 HTML 表单内的操作 div div
  • Jquery 验证自定义错误消息位置

    这看起来很简单 但我无法弄清楚 我正在使用 jquery 验证插件 我正在尝试验证
  • 从点列表中获取两个最近的点

    我得到了一个整数 浮点数列表 我需要找到最接近的两个数字 我将如何仅使用嵌套 for 循环来做到这一点 如果点是一维的 就像您的输入只是一个数字列表 例如 1 4 6 2 那么你可以通过对它们进行排序并找到差异最小的在 O n log n
  • Reactjs - redux 表单和材质 UI 框架 - 具有自动类型 - 和清除字段功能

    我正在构建一个使用 redux 表单和材料 ui 框架的嵌套表单框架 迄今为止我已经在这里构建了组件 https codesandbox io s heuristic hopper lzekw https codesandbox io s
  • 在 GWT 中使数据网格的行可拖动

    我想制作一个数据网格 其中的行可以拖动 以便人们可以通过拖动行来上下移动行 由于数据网格的行将作为元素获取 我知道如何使小部件可拖动 但是如何使数据网格的行可拖动 我不想使用任何额外的插件或库来实现此目的 我所知道的唯一支持单元格小部件拖放
  • 如何配置 Hibernate 以立即应用所有保存、更新和删除?

    我该如何配置休眠 http www hibernate org 在会话执行每个操作后立即将所有保存 更新和删除应用到数据库服务器 默认情况下 Hibernate 将所有保存 更新和删除操作排入队列 并仅在经过一段时间后才将它们提交到数据库服
  • Scala:列表 [Tuple3] 到映射 [字符串,字符串]

    我得到的查询结果为List Int String Double 我需要将其转换为Map String String 用于在 html 选择列表中显示 我的破解方案是 val prices dao getPricing flatMap cas
  • 使用 Redux Observable 等待操作序列

    我有一个用例 在使用 Redux Observables 调度另一个操作之前 我需要等待一系列操作 我见过一些类似的问题 但我无法理解如何在给定的用例中使用这些方法 本质上我想做这样的事情 action ofType PAGINATION