如何在JavaScript中正确销毁RTCPeerConnection?

时间:2018-08-28 12:47:27

标签: javascript webrtc rtcpeerconnection

当我创建一个new RTCPeerConnection()时,据我所知,我无法使用peer.close()销毁它,并且一段时间后,我用光了资源。网页创建大量RTCPeerConnection时,经过约600次尝试后它停止工作,并在Chrome中引发以下错误:

  

未捕获的DOMException:无法构造'RTCPeerConnection':无法创建那么多PeerConnections

这是一个测试脚本,它将帮助您获取错误。仅是说明性的,即使对等体的创建速度慢得多,也会出现该问题:

var i = 1;

function peer() {
  var peer = new RTCPeerConnection();
  setTimeout(() => {
    peer.close();
    peer=null;
  }, 10);
  console.log(i++);
}

setInterval(peer, 20);
// run the script and wait on console to see the error

我希望它在调用peer.close()或至少将peer设置为null时释放所有资源,因此我看不出为什么浏览器会抛出这样的错误:PeerConnections太多。我做错了什么吗?如何正确销毁同伴?谢谢

2 个答案:

答案 0 :(得分:0)

尝试将peer设置为null,以便收集垃圾。请参阅实施限制的人的these notes。如果这样不起作用,请在该邮件列表线程中询问

答案 1 :(得分:0)

好的,那是个令人困惑的谜团,幸运的是,它已经解决了,我将尝试举一个例子,以便任何人阅读这篇文章后都可以准确了解正在发生的事情。

假设您已构建了自己的程序,该程序可以对单个文件夹中的文件进行计数,并且已命令该程序对文件夹C:\ Files中的文件进行计数

该文件夹路径包含500个文件。 该程序最多需要1个小时来读取500个文件,这就是他的最大能力,因此您给他命令并按Enter。

一个小时后,您回来了,看到程序是(Dead),您在调查什么问题?那么您会发现,由于他的最大能力是每小时读取500个文件,并且该文件夹中有500个文件,所以他无法出错,但是出现错误是因为有人不断在该文件夹上投掷文件,例如无限循环,就像他花了1秒钟读取文件,并且在同一秒钟内,还有5个文件以累积方式进入 他开始进行计数,同时对新文件进行累积计数。

这正是您的情况,chrome浏览器在一秒钟内关闭对等连接,而在这一秒钟内,您将向他抛出3-4个新的对等连接,这使得chrome浏览器在标记错误后在控制台上,因为控制台后台的计算表明这是无限的,迟早会显示堆栈错误。一部分原因是通过使用这些值设置间隔时间来充斥浏览器缓存。

我已经跟踪了将近三个小时,这就是我最终得到的结果。 我将尽快编辑此帖子,并添加有关解决方法的解决方案。

好吧,我刚刚完成代码调整,这就是我得到的运行代码片段,告诉我您是否在chrome控制台上看到错误 注意:您可以删除sip Java脚本,我用它来跟踪您的错误。

希望我的帖子将来对某人有所帮助。

祝你好运

 <script src="http://sipjs.com/download/sip-0.7.2.min.js"></script>

 <meta http-equiv="Expires" content="0">
 <meta http-equiv="Pragma" content="no-cache">
 <meta http-equiv="Cache-control" content="no-cache">
 <meta http-equiv="Cache" content="no-cache">
 <script>



  var i = 1;

  function peer() {

  var peer = new RTCPeerConnection();
   
  peer.mediaHandler = null;
  peer.onicecandidate = null; 
  peer.onaddstream = null; 

  peer.close(i);

  setTimeout(() => {

  console.log('Ending Call');

  }, 3500);
  console.log(i++);



  }

 setInterval(peer, 500);


  hangUp = () => {
    let { peer} = this.state;
 
    peer.close();

 
    this.setState({
        peer: null,
      
   
    });
};




</script>