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
相关产品推荐
相关产品推荐

