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

CAF Receiver关闭处理问题:断开发送端时无法执行关闭逻辑

解决CAF Receiver关闭时无法执行异步逻辑的问题

我之前也碰到过类似的头疼情况——CAF Receiver的关闭事件总是赶不上调试器断开的速度,导致像HTTP请求这类异步逻辑根本跑不完。试过你提到的几个事件没效果的话,可以试试下面这些方案:

1. 优先使用SESSION_ENDING事件

这个事件是会话正式结束前触发的,时机比SHUTDOWN早很多,此时调试器还保持连接,足够完成异步操作。代码示例:

this.context.addEventListener(cast.framework.system.EventType.SESSION_ENDING, () => {
  this._sendStats();
});

它的核心优势就是触发时机更早,给你的统计上报留足了执行时间,不会被调试器断开打断。

2. 给HTTP请求加上keepalive参数

如果一定要在SHUTDOWN或其他晚时机的事件里执行逻辑,可以给fetch或XMLHttpRequest加上keepalive选项,让浏览器在页面卸载后仍能完成请求:

function _sendStats() {
  fetch('/your-stats-endpoint', {
    method: 'POST',
    body: JSON.stringify({ /* 你的统计数据 */ }),
    keepalive: true, // 关键:让请求在页面关闭后继续执行
    headers: {
      'Content-Type': 'application/json'
    }
  });
}

注意:keepalive有请求大小限制(通常是64KB以内),如果你的统计数据过大,可能需要精简或者改用其他方式。

3. 监听最后一个发送端断开

有时候单个发送端断开不会触发会话关闭,所以可以监听SENDER_DISCONNECTED事件,同时检查当前是否还有活跃发送端,只有当最后一个发送端断开时才执行逻辑:

this.context.addEventListener(cast.framework.system.EventType.SENDER_DISCONNECTED, (e) => {
  const activeSenders = this.context.getSenders();
  // 确认没有剩余发送端时执行上报
  if (activeSenders.length === 0) {
    this._sendStats();
  }
});

这个方案适合支持多发送端的场景,能确保在用户真正结束会话时触发逻辑。

4. 调试时的小技巧

调试时如果因为调试器断开看不到请求结果,可以:

  • 在Chrome DevTools的Network面板勾选Preserve log,这样页面关闭后请求日志依然保留,方便验证是否发送成功;
  • 用localStorage临时记录事件触发状态,比如在_sendStats里写localStorage.setItem('statsSent', 'true'),之后重新打开Receiver页面查看这个值,确认逻辑是否执行过。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:26:21