在惠州惠城区台式电脑上遇到页面已经离开、请求却还在继续的情况,先查 Fetch 请求的 keepalive,是因为它描述的只是浏览器对请求的保留行为:当发起请求的页面在请求完成之前被卸载,浏览器允许这个请求在页面卸载后继续,具体请求仍可能失败。它回答的是“允不允许继续”,并非“有没有送到”,也并非“业务有没有成功”。它与 TCP 保活分属不同层面,前者关系到页面生命周期与请求调度,后者是传输连接上的探测机制,用后者解释前者会把排查方向带偏。

适用:本题的范围是惠州惠城区台式电脑的浏览器软件侧,只读现有代码、配置和去敏记录,不重做客户原操作,不修改生产页面,也不改动原业务数据。就机制本身而言,keepalive 是 Request 上的一个布尔设置;与同类收尾上报场景常用的 sendBeacon 相比,它允许使用 POST 以外的方法、自定义请求属性,并能通过 fetch 返回的 Promise 读取服务端响应,在 service worker 中同样可用。这些差别决定了代码里的写法,也决定了排查该从哪里入手。
观察:可以按顺序做几件事,每一步都带结果条件。第一,在现有前端代码中定位发起该请求的 fetch 调用,看是否显式把 keepalive 设为 true;若没有设置,那么“页面离开后请求仍继续”就不能用这个机制解释,应转而检查其他触发路径。第二,看这个调用挂在哪个时机上,是否位于页面卸载、跳转或关闭前的处理链路中;请求也可能早于卸载很久发起,重点看卸载时它是否还在进行,不从发起时间单独推断。第三,把已有的网络记录与业务记录分开核对,只读既有材料,不重新发起请求;网络记录用来说明请求是否真的发出、何时发出,业务记录用来说明服务端是否受理、是否入账。若两者不一致,应保留送达或受理待核状态,不能仅靠请求配置判断。
风险:把 keepalive 当成送达证明,会让排查停在错误结论上;为了“验证”而重发同一请求,可能在业务侧产生第二条记录,污染原有数据;把 TCP 保活混进来,会去查连接层而放过对页面卸载时机的判断;只看网络记录不看业务记录,也容易把“已发出”误当成“已受理”。
下一步:整理去敏材料,包括发起该请求的调用片段并隐去域名、参数值和任何标识,页面跳转或关闭的触发位置,现场浏览器的实际版本,网络记录中该请求的时间点与状态,以及业务侧的受理记录时间点。这些材料只做只读比对,不重发请求。需要进一步判断时,可拨打 400-877-9605 咨询;电脑快修网是信息展示与第三方维修对接平台,该号码只作咨询,实际范围和安排需确认。把保留层与结果层分开核对之后,再决定是改代码路径还是查服务端受理,才不至于在同一个现象上反复绕圈。