在长时间 api 调用完成之前更改路由会覆盖 vuex 存储

发布于 2025-01-19 10:39:49 字数 419 浏览 0 评论 0原文

我的 vuex 存储中有一个很长的 api 调用,如果我在完成之前更改路线并使用更快的 api 调用从另一个页面分派相同的操作,则第一个调用最终将覆盖第二个调用。该操作如下所示:

async getData({ commit }, payload) {
  try {
    const params = {...};

    const res = await axios.get(`/data`, {
      params,
    });

    if (res.status === 200) {
      commit("setData", res.data);
    }
  } catch (error) {
    commit("setError", error.response);
  }
},

有没有办法防止这种情况发生?

I have a long api call in my vuex store and if I change the route before it's finished and dispatch the same action from another page with a quicker api call the first call will eventually overwrite the second call. The action looks like this:

async getData({ commit }, payload) {
  try {
    const params = {...};

    const res = await axios.get(`/data`, {
      params,
    });

    if (res.status === 200) {
      commit("setData", res.data);
    }
  } catch (error) {
    commit("setError", error.response);
  }
},

Is there a way to prevent this from happening?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

心意如水 2025-01-26 10:39:49

如果要防止“最后完成”异步调用覆盖状态,则需要取消任何旧操作,以免完成。

在您的示例中,由于您使用的是Axios,因此最简单的选择是使用abortController

在您的操作中,通过signal> signal param将控制器连接到Axios方法:

const controller = new AbortController()

let result = axios.get('/foo/bar', { signal: controller.signal })

然后,当您需要取消它(即在调用新操作之前,只需调用):

controller.abort()

If you want to prevent the 'last to finish' async call from overwriting the state, you need to cancel any old actions so they don't complete.

In your example, since you are using axios, the easiest option is to use an AbortController.

In your action, attach the controller to the axios method via the signal param:

const controller = new AbortController()

let result = axios.get('/foo/bar', { signal: controller.signal })

Then when you need to cancel it (i.e before calling a new action, simply call):

controller.abort()
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文