当前位置: 首页 > 知识库问答 >
问题:

如何在React/Redux中取消挂起的异步操作

冀弘济
2023-03-14

考虑以下情况:

当用户导航到页面时,将调度两个异步Redux操作以并行获取两组相关数据。如果这些获取中的任何一个失败,组件将检测到它,它将在下一个周期中呈现错误组件,而下一个周期又在装载时分派clearState操作。

但是,其他行动仍有待解决/拒绝,将破坏清洁状态。目标是在调用clearStateaction creator时,中断此(最好是许多其他)挂起的异步操作。好吧,不管发生什么,未决promise都应该以任何方式解决/回应。

我首先想到的是为每个减速机引入INTERRUPTED标志,但是我不知道如何使用它来使下面的成功/错误操作不影响/返回默认状态。

如何做到这一点,将复杂性保持在最低限度?

共有2个答案

袁河
2023-03-14

我最近遇到了同样的问题,我不得不取消挂起或过时的异步redux操作。我通过创建一个cancel redux操作中间件解决了这个问题。

在redux中,我们有中间件的概念。因此,当您发送请求时,它将通过中间件列表。一旦api响应,它的响应将在到达redux商店并最终到达你的用户界面之前通过许多中间件。

现在假设我们已经编写了一个取消中间件。api请求在启动时将通过这个中间件,当api响应时,api响应也将通过这个中间件。

redux中的每个api请求都与一个操作相关联,每个操作都有一个类型和有效负载。

编写一个中间件,每当完成api请求时,该中间件都会存储关联的操作类型。它还存储一个标志,说明是否放弃此操作。如果再次触发类似类型的操作,请将此标志设置为true,该标志表示放弃此操作。由于此api请求的discard标志已设置为true,当针对上一个操作的api响应出现时,从中间件发送null作为响应。

有关此方法的详细信息,请查看此博客。https://tech.treebo.com/redux-middlewares-an-approach-to-cancel-redux-actions-7e08b51b83ce

戚森
2023-03-14

我有一个类似的问题,我使用jquery来生成ajax请求和redux thunk中间件。

解决方案是让你的动作创建者返回promise,这个promise将由调度函数返回,然后你就可以中止它。

在我的action creator中,我有如下内容:

function doSomething() {
  return (dispatch) => {
    return $.ajax(...).done(...).fail(...);
  }
}

然后在我的组件中,我有:

  componentDidMount(){
    this.myPromise = this.props.dispatch(doSomething());
  }

  somefnct() {
    this.myPromise.abort();
  }

也可以看看丹·阿布拉莫夫的评论。

 类似资料:
  • 问题内容: 我有一个使用redux和react-router的通用react应用程序。 我有以下几种路线: 等等 每个路由都需要来自API的数据。目前,我在Navigation组件中的元素调度了一个async action ,该操作使用来自该路线的API中的数据填充商店。 对于MVP,我只是在路线更改时用新的帖子内容覆盖商店中的内容,这样我们就可以获取API上的所有新内容。 我已经意识到在按钮上设

  • 我试图理解为什么这段代码返回“Promise{pending}”。 当我通过reduceDirections()函数时,我可以看到我得到了想要的结果。但是当我(一行之后)时,我会改为“Promise pending” 很抱歉,我不理解promise和异步等待。我曾尝试在mdn上阅读和观看视频,但我不知道如何将它们显示的内容转移到这个问题上。提前感谢您的帮助!

  • 我开始学钩子了。但是我不明白异步调用是如何工作的。早些时候我被使用 然后调用我的,但是我应该用useDispat()做什么?如果我只是调用 然后我的< code > foo() don t < code > console . log(2) 我正在使用thunk

  • 问题内容: 我正在构建一个需要在某些情况下显示确认对话框的应用程序。 假设我要删除某些东西,然后我将分派一个动作,以便某些化简器会捕获该事件并填充对话框化简器以显示它。 当此对话框提交时,我会怀疑。 该组件如何根据分派的第一个动作分派适当的动作? 动作创建者应该处理这种逻辑吗? 我们可以在减速器中添加动作吗? 编辑: 使其更清楚: 因此,我试图重用对话框组件。显示/隐藏对话框不是问题,因为这可以在

  • 我正在构建一个应用程序,它需要在某些情况下显示一个确认对话框。 假设我想删除一些东西,那么我将发送一个类似的操作,这样一些reducer将捕获该事件并填充对话框reducer以显示它。 当这个对话框提交时,我的疑问就来了。 null 所以我正在尝试重用dialog组件。显示/隐藏对话框这不是问题,因为这可以很容易地在reducer中完成。我试图指定的是,如何根据在左侧启动流的动作,从右侧分派动作。

  • 如何取消/中止angular 4中所有挂起的HTTP请求。 有一个取消HTTP请求的方法,但是如何一次取消所有挂起的请求。 尤其是在改变路线的时候。 我做了一件事 但是如何在全球范围内实现这一点 有什么想法吗?