乐观更新后数据不一致怎么办?

Zz慧丽 阅读 3

我在做点赞功能时用了乐观更新,先本地改状态再发请求,但网络失败后回滚老出问题。

比如用户点完赞,UI立刻变成已点赞,结果请求失败了,我试着用 try/catch 回滚,但有时候状态还是对不上,是不是哪里逻辑漏了?

这是我的简化代码:

const handleLike = async () => {
  const prevLiked = liked;
  setLiked(true); // 乐观更新

  try {
    await api.likePost(postId);
  } catch (error) {
    setLiked(prevLiked); // 回滚
    alert('点赞失败');
  }
};
我来解答 赞 2 收藏
二维码
手机扫码查看
1 条解答
一淑芳
一淑芳 Lv1
我之前踩过这个坑,乐观更新看起来简单,但网络不稳定的时候确实容易出问题。你现在的代码逻辑基本上是对的,但在实际操作中可能会遇到一些微妙的问题。主要是因为在异步操作中,状态可能会被其他操作影响。你可以尝试在 try 块里保存一个当前的 post 状态,然后再进行回滚,这样可以确保回滚到的是最新的状态而不是中间状态。另外,你还可以加个标志位来防止重复触发请求。

试试看这段代码:

const handleLike = async () => {
if (isRequestPending) return; // 防止重复请求
isRequestPending = true;

const currentLiked = liked;
setLiked(!currentLiked); // 乐观更新

try {
await api.likePost(postId);
} catch (error) {
setLiked(currentLiked); // 回滚到更新前的状态
alert('点赞失败');
} finally {
isRequestPending = false; // 请求完成,重置标志位
}
};


注意这里加了一个 isRequestPending 的标志位,防止在请求还没完成的时候再次触发点赞操作。这样可以避免一些竞态条件的问题。希望这能帮到你。
点赞
2026-03-25 05:03