我的这段不会取消请求,请问是什么问题? axios怎么取消请求?

这是我的axios依赖:

"axios": "^1.4.0",

这是我的代码

const source = axios.CancelToken.source();
data = {
    ...data,
    ...JSON.parse(localStorage.getItem('_TT_token')),
    cancelToken: source.token
}
const xhr = axios.post(url,data)
// 如果xhrMap中存在该url请求,则执行取消操作
if (xhrMap[url]) {
    source.cancel('Operation canceled by the user.')
}
xhrMap[url] = xhr
xhr.then(
    (response) => {
        resolve(response.data);
    },
    (err) => {
        if (axios.isCancel(err)) {
            console.log('Request canceled:', err.message);
        } else {
              reject(err);
          }
    }
);

这段代码有什么问题么?请求并不会取消

阅读 1.3k
avatarAI BotBETA

看起来,你在使用 axiosCancelToken 来取消请求。但是在你的代码中,CancelToken 被正确地创建了,但是并没有正确地传递给请求。你创建了 source.token 并添加到了数据对象中,但是并没有将它传递给 axios.post 请求。

你应该将 cancelToken 作为第三个参数传递给 axios.post,就像这样:

const source = axios.CancelToken.source();
data = {
    ...data,
    ...JSON.parse(localStorage.getItem('_TT_token')),
    cancelToken: source.token
}
const xhr = axios.post(url, data, {cancelToken: source.token});
// 如果xhrMap中存在该url请求,则执行取消操作
if (xhrMap[url]) {
    source.cancel('Operation canceled by the user.');
}
xhrMap[url] = xhr
xhr.then(
    (response) => {
        resolve(response.data);
    },
    (err) => {
        if (axios.isCancel(err)) {
            console.log('Request canceled:', err.message);
        } else {
              reject(err);
          }
    }
);

在这段代码中,我们传递了一个配置对象作为第三个参数给 axios.post。这个配置对象包含一个 cancelToken 属性,其值就是我们之前从 CancelToken.source().token 获取的 token。这样,我们就可以使用这个 token 来取消请求了。

3 个回答
data = {
    ...data,
    ...JSON.parse(localStorage.getItem('_TT_token')),
    cancelToken: source.token
}
axios.post(url,data)

应为

axios.post(url, data, {
    cancelToken: source.token
})

Axios v0.22.0 开始,推荐使用 AbortController 来取消请求。这是基于 Fetch API 的标准方法。

const controller = new AbortController();
axios.get('/some/url', { signal: controller.signal })
.then(response => {
  // 请求成功处理
})
.catch(error => {
  if (error.name === 'AbortError') {
    // 请求被取消
    console.log('The request was aborted');
  } else {
    // 处理其他错误
  }
});

// 在需要取消请求的地方调用
controller.abort();

你应该先判断 xhrMap 里是否有缓存数据,然后再调用 axios.post 发起请求;而不是发起请求之后再取消。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题