如何阻止react-query mutation中未执行的后续任务运行
如何阻止react-query mutation中未执行的后续任务运行
嘿,我懂你遇到的问题了——你有个react-query的mutation,里面串了好几个串行的异步长任务,虽然已经在运行的任务没法中途取消,但想在点击取消按钮后,让还没开始执行的后续任务直接停掉,不用再往下走了对吧?
先还原下你现在的mutation代码结构:
useMutation({ mutationFn: async () => { await firstTask() await secondTask() await thirdTask() }, ... })
你提到的用ref来拦截的思路其实完全可行,而且实现起来也不复杂,具体可以这么做:
- 首先用
useRef创建一个标记变量,用来记录是否需要取消后续任务,初始值设为false - 在mutation的每一个异步任务执行完成后,都检查这个ref的状态:如果ref的
current属性是true,就直接返回,终止后续代码执行;如果是false,就继续执行下一个任务 - 最后在取消按钮的点击事件里,把这个ref的
current设置为true,这样后续的任务就会被拦截下来
给你写个具体的代码示例参考:
import { useMutation, useRef } from '@tanstack/react-query' // 组件内部逻辑 const isCanceled = useRef(false) const { mutate } = useMutation({ mutationFn: async () => { await firstTask() // 执行完第一个任务后检查是否取消 if (isCanceled.current) return await secondTask() // 执行完第二个任务后再次检查 if (isCanceled.current) return await thirdTask() }, // 重要:每次mutation触发前重置取消标记,避免上次的状态影响下一次请求 onMutate: () => { isCanceled.current = false } }) // 取消按钮的点击处理函数 const handleCancel = () => { isCanceled.current = true }
这里要特别提醒一句:一定要在mutation的onMutate钩子(或者每次调用mutate之前)重置ref的状态,不然如果上次点击过取消,ref的current还是true,下一次触发mutation的时候,任务会直接被拦截,根本不会执行,这就不符合预期啦。
备注:内容来源于stack exchange,提问作者Undistraction
相关产品推荐
相关产品推荐

