全局声明的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
相关产品推荐
相关产品推荐

