Javascript Closure和WebRTC回调问题

时间:2015-11-09 16:50:25

标签: javascript callback closures webrtc

我遇到了这个问题,我在创建一个闭包并使用调试器时,在闭包回调(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;
}

请从调试器中注意这些:

connectionClientId已设置 - connectingClientSet

在调用时未设置connectionsClientId - connectingClientUnset

我在这里缺少什么?

1 个答案:

答案 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.');
    });
};