JS browser: проверьте, является ли ошибка, сгенерированная getUserMedia (), объектом ошибки DOMException - PullRequest
0 голосов
/ 22 апреля 2020

Я хочу знать, возникла ли ошибка в следующей цепочке обещаний из-за функции getUserMedia () или из-за функций webRT C. Firefox документация говорит: Отклонение возвращенного обещания делается путем передачи объекта ошибки DOMException обработчику отказа обещания. Итак, как я могу узнать, является ли полученный мной объект ошибки объектом ошибки DOMException, как в chrome, так и в firefox?

function handleVideoOfferMsg(msg) {
  var localStream = null;

  targetUsername = msg.name;
  createPeerConnection();

  var desc = new RTCSessionDescription(msg.sdp);

  myPeerConnection.setRemoteDescription(desc).then(function () {
    return navigator.mediaDevices.getUserMedia(mediaConstraints);
  })
  .then(function(stream) {
    localStream = stream;
    document.getElementById("local_video").srcObject = localStream;

    localStream.getTracks().forEach(track => myPeerConnection.addTrack(track, localStream));
  })
  .then(function() {
    return myPeerConnection.createAnswer();
  })
  .then(function(answer) {
    return myPeerConnection.setLocalDescription(answer);
  })
  .then(function() {
    var msg = {
      name: myUsername,
      target: targetUsername,
      type: "video-answer",
      sdp: myPeerConnection.localDescription
    };

    sendToServer(msg);
  })
  .catch(function(e){
   //know if error is generated by getUserMedia()
  });
}

1 Ответ

0 голосов
/ 23 апреля 2020

Правильный способ сделать это - не смотреть на объект ошибки, а поймать ошибку в нужной точке потока.

например, вы можете иметь

.then(function(stream) { ...},
      (err) => { gumErrored = true; throw(err) ; }
     )

Таким образом, вы все равно сможете справиться с этим окончательным уловом (при условии, что это то, что вам нужно), проверив, был ли флаг gumErrored истинным, но с уверенностью относительно источника ошибки.

(Вы можете пропустить одно обещание в цепочке, введя return myPeerConnection.createAnswer() в тот же блок)

...