如何取消 RTK 查询请求

Far*_*689 6 reactjs react-redux redux-toolkit rtk-query

我正在使用 RTK 查询来处理我的请求。但我在取消请求时遇到问题。

场景是这样的,我有一个模式来显示一个表单来添加待办事项,但是,当用户想要关闭模式时,如果请求尚未挂起,则应该取消该请求。

const [addTodo, { isLoading }] = useAddTodoMutation();

const onSubmit = async (values: ToDo) => {
     try {
      await addTodo(values).unwrap();
      console.log('Successful')
    } catch (error) {
      console.log('failed')
    }
  };
Run Code Online (Sandbox Code Playgroud)

我知道有一个abort取消突变addTodo(values).abort();,我们可以在useEffect清理中使用它useRef

是否可以编写通用方法或自定义挂钩来包装所有突变并在卸载组件时处理取消请求?

phr*_*hry 9

这样做几乎没有任何价值。如果您的请求处于待处理状态,只要您不在最初的几毫秒内,该请求就已经发送到服务器,客户端只是在等待响应。即使您取消请求并且服务器上的数据可能已经更改,服务器也会继续处理该请求。因此,让请求完成然后使所有可能因突变而更改的缓存数据(通常通过重新获取)失效通常是有意义的。

如果您取消请求,则不会发生无效。

话虽如此:如果你用 触发你的突变myTriggerFunction(),你可以做

const request = myTriggerFunction()

// ...

request.abort()
Run Code Online (Sandbox Code Playgroud)

  • 我不同意你的说法“这样做几乎没有任何价值”,第一个原因是 dotnet 中构建的服务器确实有 CancellationToken 用于检测服务器的取消和中止。当您有自动完成功能时,此类取消非常有用。当用户决定输入更多或更少时,您将取消使用旧搜索词的请求,并使用较新的词开始新的请求,在高度使用的应用程序中,它确实有所不同。其次,即使服务器无法取消,浏览器也有并发请求的限制,当不需要旧请求时,它会允许较早地排队新请求。 (3认同)
  • 这并不全与服务器有关...请求取消会阻止将过时的查询数据加载到状态中,从而导致 UI 更新卡顿并降低响应能力。请求取消是前端开发的一个基础、基础的工具。我遇到过许多现实世界的场景,这很重要。 (2认同)