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

全局声明的rtcobj赋值RTCPeerConnection后为何重新指向null

问题成因

这是JavaScript异步执行机制导致的执行顺序问题,不存在“回调执行后rtcobj变回null”的情况,本质是两处打印代码的执行顺序和你预期的不一致:

  • navigator.webkitGetUserMedia是典型的异步非阻塞API,调用时传入的成功回调函数不会立刻同步执行,会被暂存到事件队列中,需要满足两个前置条件才会执行:1. 用户完成媒体设备授权、浏览器成功拿到媒体流;2. 主线程上的所有同步代码全部执行完毕。
  • 你写在webkitGetUserMedia调用后的console.log("rtc:"+rtcobj)是主线程同步代码,会在回调执行前就运行,这时候还没有走到给rtcobj赋值的逻辑,打印的是全局rtcobj的初始值null。
  • 等到同步代码执行完毕、授权成功后,回调函数才会被调用,内部给rtcobj赋值、打印实例,这时候全局的rtcobj已经被成功修改为RTCPeerConnection实例,不存在回退为null的情况。
验证方法

你可以添加以下代码验证回调执行后全局rtcobj的实际状态:

// 放在原有代码的最后
setTimeout(() => {
  // 延迟5秒打印,此时授权和回调逻辑已经执行完成
  console.log("延迟打印全局rtcobj:", rtcobj)
}, 5000)

输出的结果会是你预期的RTCPeerConnection实例。

解决方案

所有依赖rtcobj实例的逻辑,都要放在回调函数内部执行,或者用Promise/async await对webkitGetUserMedia做封装,用同步写法控制异步执行顺序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 10:36:02