我遇到了这个问题,我在创建一个闭包并使用调试器时,在闭包回调(localOfferCreated)中正确设置了connectionClientId变量。当createOffer调用回调时,connectedClientId未定义。这怎么可能是这种情况?在这一个人的整个晚上一直撞在墙上。
function publishStream(handShakeInitiator, connectingClientId) {
var localOfferCreated = offerClosure(connectingClientId);
var localIceCandidate = iceClosure(connectingClientId);
peerConnections[connectingClientId] = new RTCPeerConnection(peerConnectionConfig);
peerConnections[connectingClientId].onicecandidate = localIceCandidate;
peerConnections[connectingClientId].addStream(localStream);
if (handShakeInitiator) {
peerConnections[connectingClientId].createOffer(localOfferCreated, createOfferError, offerOptions);
}
}
function offerClosure(id) {
var connectingClientId = id;
function offerCreated(description) {
peerConnections[connectingClientId].setLocalDescription(description, function (connectingClientId) {
webSocket.send(JSON.stringify({
'control': signalConstants.sendToClient,
'cid': connectingClientId,
'sdp': description
}));
}, function () {
console.log('Error setting description.');
});
};
return offerCreated;
}
请从调试器中注意这些:
我在这里缺少什么?
答案 0 :(得分:4)
来自RTCPeerConnection.setLocalDescription
<强> successCallback 强>
是一个没有参数的函数,将被调用 当描述已成功设置。在这一点上,人们可以 将要约发送到可以将其转发到远程服务器的远程服务器 客户端
您正在通过将其作为内部函数参数重新定义connectingClientID
。请记住,命名函数参数是一个隐式变量声明,正如文档所说的那样,它不会被定义,因为成功回调不会给出任何参数。 JavaScript函数可以访问它们的外部作用域,因此你的匿名函数不需要传递这个arg,它可以简单地引用它创建一个闭包。
function offerCreated(description) {
peerConnections[connectingClientId].setLocalDescription(description, function() {
webSocket.send(JSON.stringify({
control: signalConstants.sendToClient,
cid: connectingClientId,
sdp: description
}));
}, function () {
console.log('Error setting description.');
});
};