在 api 调用完成之前更改路由会覆盖 vuex 存储
Changing route before long api call finishes overwrites vuex store
我在我的 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);
}
},
有没有办法防止这种情况发生?
如果您想防止 'last to finish' 异步调用覆盖状态,您需要取消所有旧操作,以免它们完成。
在您的示例中,由于您使用的是 axios
,最简单的选择是使用 AbortController
.
在您的操作中,通过 signal
参数将控制器附加到 axios
方法:
const controller = new AbortController()
let result = axios.get('/foo/bar', { signal: controller.signal })
然后当您需要取消它时(即在调用新操作之前,只需调用):
controller.abort()
我在我的 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);
}
},
有没有办法防止这种情况发生?
如果您想防止 'last to finish' 异步调用覆盖状态,您需要取消所有旧操作,以免它们完成。
在您的示例中,由于您使用的是 axios
,最简单的选择是使用 AbortController
.
在您的操作中,通过 signal
参数将控制器附加到 axios
方法:
const controller = new AbortController()
let result = axios.get('/foo/bar', { signal: controller.signal })
然后当您需要取消它时(即在调用新操作之前,只需调用):
controller.abort()