2015-09-21 44 views
0

由於某種原因,當我創建新的新會話時,我的發佈者會發起兩次發佈。然而,第二個,不是它應該是的div。同樣,如果你連接到會話,你會得到相同的,所以它只顯示自己。發佈商發起兩次,僅適用於自己的發件人

我試圖找出它出現的原因。這裏有一些片段:

var getApiAndToken, initializeSession; 
​ 
getApiAndToken = function() { 
    var apiKey, customer_id, sessionId, token; 
    if (gon) { 
    apiKey = gon.api_key; 
    } 
    if (gon) { 
    sessionId = gon.session_id; 
    } 
    if (gon) { 
    token = gon.token; 
    } 
    if (gon) { 
    customer_id = gon.customer_id; 
    } 
    initializeSession(); 
}; 
​ 
initializeSession = function() { 
    var publishStream, session; 
    session = OT.initSession(apiKey, sessionId); 
    session.connect(token, function(error) { 
    if (!error) { 
     session.publish(publishStream(true)); 
     layout(); 
    } else { 
     console.log('There was an error connecting to the session', error.code, error.message); 
    } 
    }); 
    $('#audioInputDevices').change(function() { 
    publishStream(false); 
    }); 
    $('#videoInputDevices').change(function() { 
    publishStream(false); 
    }); 
    return publishStream = function(loadDevices) { 
    var publisherOptions; 
    publisherOptions = { 
     audioSource: $('#audioInputDevices').val() || 0, 
     videoSource: $('#videoInputDevices').val() || 0 
    }; 
    OT.initPublisher('publisherContainer', publisherOptions, function(error) { 
     if (error) { 
     console.log(error); 
     } else { 
     if (loadDevices) { 
      OT.getDevices(function(error, devices) { 
      var audioInputDevices, videoInputDevices; 
      audioInputDevices = devices.filter(function(element) { 
       return element.kind === 'audioInput'; 
      }); 
      videoInputDevices = devices.filter(function(element) { 
       return element.kind === 'videoInput'; 
      }); 
      $.each(audioInputDevices, function() { 
       $('#audioInputDevices').append($('<option></option>').val(this['deviceId']).html(this['label'])); 
      }); 
      $.each(videoInputDevices, function() { 
       $('#videoInputDevices').append($('<option></option>').val(this['deviceId']).html(this['label'])); 
      }); 
      }); 
     } 
     } 
    }); 
    }; 
}; 

它也問我設備訪問兩次。

回答

0

我看到你的代碼提供了兩個普遍問題:在您嘗試不可見裏面initializeSession()

  1. 變量api_keysession_id,並且tokengetApiAndToken()函數內的作用域僅該功能,因此,使用它們。

  2. publishStream()函數的目標不明確,其用法不一致。每次調用它時(一旦會話連接並且每次下拉值更改時),此函數都會創建一個新的發佈服務器。它也不會返回任何內容,因此在表達式session.publish(publishStream(true))中使用它時,實際上只是調用session.publish(),這會導致將新的發佈服務器添加到頁面的末尾,因爲沒有指定任何元素ID。最後一部分是你說它不在<div>的原因。

這聽起來像你想要的是一個發佈者的下拉選擇使用哪些設備。我爲你創建了一個例子:https://jsbin.com/sujufog/11/edit?html,js,output

簡而言之,下面是它的工作原理。它首先初始化一個虛擬發佈者,以便瀏覽器可以提示用戶使用相機和麥克風的權限。這是讀取可用設備所必需的。請注意,如果您使用通過HTTPS提供的頁面,瀏覽器(例如Chrome)將會更早地記住您在該域上允許的權限,而不必再次提示用戶。因此,在Chrome上,虛擬發佈者不會爲已經運行應用程序的用戶顯示任何提示。接下來,虛擬發佈者將被拋棄,並調用OT.getDevices()來讀取可用設備並填充下拉菜單。當發生這種情況時,會話也會連接,並且在任何一個下拉列表中選擇的每個變化都將調用publish()函數。在該功能中,如果以前的發佈者已存在,則首先將其刪除,然後使用當前選定的設備創建新的發佈者。然後,新的發佈者被傳入session.publish()