You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求状态‘canceled’的含义及Ajax场景下的成因分析

关于Ajax请求显示canceled的问题解答

完全正确!你猜测的页面卸载和Ajax请求之间的竞态条件正是这种情况的核心原因。

当你点击页面链接时,浏览器的默认行为是立即启动导航流程:卸载当前页面、加载新页面。如果你的Ajax请求是在点击事件后才发起,且请求还没完成(甚至可能还没完成发送阶段),浏览器就会直接终止这个未完成的网络请求,这时开发者工具里就会显示请求状态为canceled。

canceled状态的具体含义

这个状态直白来说就是:

  • 浏览器主动中断了该网络请求,没有等待服务器返回响应
  • 请求可能只发送了一部分,或者压根没发送出去(取决于请求发起和页面卸载的时间差)
  • 你的前端代码完全无法获取到该请求的任何响应数据,因为请求已经被中途叫停了

针对你不在意响应的情况的处理建议

既然你提到响应里没有有价值信息,那如果需要保证请求尽可能被服务器接收到,可以试试这两种方案:

  1. 先阻止跳转,等请求完成后再手动导航
    用event.preventDefault()拦截链接的默认跳转,等Ajax请求完成(无论成功失败)后再跳转到目标页面:
    $('a').on('click', function(e) {
      e.preventDefault();
      const targetHref = $(this).attr('href');
      
      $.ajax({
        url: '你的日志服务接口地址',
        method: 'POST',
        data: { /* 日志数据 */ },
        complete: function() {
          // 请求完成后执行跳转
          window.location.href = targetHref;
        }
      });
    });
    
  2. 使用navigator.sendBeacon()发送无响应请求
    这个API是专门为这种“不需要响应、希望在页面卸载前完成发送”的场景设计的,浏览器会后台优先处理它,不会轻易被页面卸载中断:
    $('a').on('click', function(e) {
      e.preventDefault();
      const targetHref = $(this).attr('href');
      
      // 发送日志请求,sendBeacon会在后台处理
      navigator.sendBeacon('你的日志服务接口地址', JSON.stringify({ /* 日志数据 */ }));
      
      // 直接跳转即可,不影响sendBeacon的发送
      window.location.href = targetHref;
    });
    

如果连请求是否被服务器接收都不在意,那其实完全不用做额外处理——你已经清楚这种canceled状态的原因,且不需要响应结果,保持现状就没问题。

内容的提问来源于stack exchange,提问作者Gal Ratzker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:36:28