除掉 TempDescriptions 全局变量,并将sdp传递给 getStream(offer.sdp) 直。
TempDescriptions
getStream(offer.sdp)
否则,你就是 socket.on('ask', function(offer){ 叫4次,覆盖 TempDescriptions 。然后3秒以后你的4 setTimeout 滚动,所有访问的最终值 TempDescriptions 只要。
socket.on('ask', function(offer){
setTimeout
这可能就是为什么只有一个RTCPeerConnection重新连接。
通常,使用时间延迟来分离连接似乎是一个坏主意,因为它会减慢重新连接速度。相反,为什么不发送 id ?例如。
id
socket.emit('ask', {id: connectionNumber++, sdp: JSON.stringify(pc.localDescription), user: loggedUserID, fromSocket: ownSocket});
window
每当您分配一个未声明的变量时,如下所示:
connection = getPeerConnection();
......它创造了一个全球性的 window ,例如 window.connection ,你有同样的问题。你有4个连接,但是你将它们存储在一个变量中。
window.connection
类型 "use strict"; 在你的源文件的头部抓住这个:
"use strict";
ReferenceError: assignment to undeclared variable connection
你在这里处理4个连接,但你没有一个方法来确定每个实例的范围。
大多数其他语言会告诉您创建一个类并创建对象实例,并将所有内容包括在内 connection 上 this 。这是一个很好的方法。在JS中,您可以使用闭包。但至少你还需要4个变量来保存4个连接,或者是一个数组 connections 。然后你抬头看。来自 id 我提到了要处理的连接。
connection
this
connections
还有,你的 try / catch es不会捕获异步错误。我强烈建议,而不是定义所有这些回调 使用承诺 , 甚至 异步/ AWAIT 处理高度异步的WebRTC API时。这使得范围界定变得微不足道。例如。
try
catch
const connections = []; socket.on('ask', async ({user, id, sdp, fromSocket}) => { try { if (user != loggedUserID) return; if (!connections[id]) { connections[id] = getPeerConnection(); registerIceCandidate(connections[id]); } const connection = connections[id]; await connection.setRemoteDescription(JSON.parse(sdp)); await connection.setLocalDescription(await connection.createAnswer()); socket.emit('response', {sdp, user: loggedUserID, fromSocket: ownSocket, toSocket: fromSocket}); } catch (err) { console.log(err); } };
这样,错误处理是可靠的。