Обратный вызов RTCPeerConnection.createAnswer возвращает неопределенный объект в mozilla для чата WebRTC

Вот мой код для ответа на входящий звонок:

var pc = connection.pc;
pc.setRemoteDescription(sdp,function() {
 pc.createAnswer(function(answer) {
  pc.setLocalDescription(answer,function() {
   // code for sending the answer
 }) 
 })
})

Приведенный выше код отлично работает для Chrome, но когда я запускаю то же самое в Mozilla, answer, полученный из обратного вызова pc.createAnswer, равен undefined. В результате у меня возникает следующая ошибка:

TypeError: аргумент 1 RTCPeerConnection.setLocalDescription не является объектом.


person Bhargav Madia    schedule 04.04.2016    source источник


Ответы (1)


Проблема в том, что вы не проверяете ошибки, а именно: не передаете требуемые обратные вызовы ошибок.

setRemoteDescription и setRemoteDescription требуют либо трех аргументов (устаревший стиль обратного вызова) или один (обещает), но вы проходите через два. То же самое для createAnswer минус один.

Привязки JS браузера в конечном итоге выбирают неправильную перегрузку, возвращая вам обещание, которое вы тоже не проверяете, эффективно проглатывая ошибки.

Либо добавьте необходимые обратные вызовы ошибок:

var pc = connection.pc;
pc.setRemoteDescription(sdp, function() {
  pc.createAnswer(function(answer) {
    pc.setLocalDescription(answer, function() {
      // code for sending the answer
    }, function(e) {
      console.error(e);
    });
  }, function(e) {
    console.error(e);
  });
}, function(e) {
  console.error(e);
});

Или используйте современный API обещаний:

var pc = connection.pc;
pc.setRemoteDescription(sdp)
  .then(() => pc.createAnswer())
  .then(answer => pc.setLocalDescription(answer))
  .then(() => {
    // code for sending the answer
  })
  .catch(e => console.error(e));

API обещаний доступен изначально в Firefox или через adapter.js в Chrome. См. скрипку.

И всегда проверяйте на наличие ошибок. ;)

person jib    schedule 04.04.2016