Redux Toolkit Query调用updatePost mutation多次点击后请求pending数据不更新
问题根因与修复方案
1. 后端未返回响应导致请求一直pending
你提供的后端updatelike接口逻辑中,无论数据库操作成功/失败,都没有给前端返回HTTP响应,导致前端发起的请求一直处于等待响应的状态,对应RTK Query的mutation状态就会停留在pending。
修复方案:在数据库操作的回调中添加响应返回逻辑:
exports.updatelike = async (req, res) => { // 补充res参数 try { console.log("UPDATELIKE"); const d = new Date(Date.now()); console.log(d.getHours() + ":" + d.getMinutes() + ":" + d.getSeconds()); console.log(req.params.id); var values = { likes: req.body.likes, userslike: req.body.userslike, dislikes: req.body.dislikes, usersdislike: req.body.usersdislike, }; var selector = { where: { id: req.params.id } }; await Post.update(values, selector) // 改成async/await写法更易维护 res.json({ success: true }) // 操作成功返回响应 } catch (ex) { console.log(">> Error while Update one post : ", ex); res.status(500).json({ success: false, error: ex.message }) // 错误场景也返回响应 } };
2. 快速点击触发请求竞态导致数据更新异常
你当前的更新逻辑是前端直接计算点赞数后全量覆盖数据库字段,快速点击时多个请求先后顺序不可控,后发的请求可能携带旧的数值覆盖先发请求的正确更新,最终表现为数据没有更新。
修复方案二选一:
- 前端层面:点击按钮后立刻设置loading状态禁用按钮,直到mutation请求返回后再恢复可点击状态,避免重复提交;同时可以加200-300ms的防抖,过滤连续点击的重复请求。
- 后端层面:修改更新逻辑,用数据库原子操作代替前端传值覆盖,比如点赞操作直接执行
likes = likes + 1的逻辑,从根源避免竞态:
// sequelize 原子更新写法示例 Post.update( { likes: sequelize.literal('likes + 1'), userslike: sequelize.fn('array_append', sequelize.col('userslike'), req.body.userId) // 假设用户id从请求体取,根据你的实际逻辑调整 }, { where: { id: req.params.id } } )
3. 前端onCacheEntryAdded逻辑不完整
你当前写的onCacheEntryAdded是async异步函数,但没有等待异步操作完成,也没有处理缓存清理逻辑,可能导致RTK Query内部状态异常。如果这个钩子没有实际业务逻辑可以直接删除,需要保留的话补充完整逻辑:
async onCacheEntryAdded( arg, { dispatch, getState, extra, requestId, cacheEntryRemoved, cacheDataLoaded, getCacheEntry } ) { try { await cacheDataLoaded; // 等待请求完成 console.log(arg) console.log("Mutation = ") console.log(getState().api.mutations) } catch (e) { // 处理请求错误逻辑 } finally { await cacheEntryRemoved; // 等待缓存清理完成 } }
内容的提问来源于stack exchange,提问作者Nicolas Popy
相关产品推荐
相关产品推荐

