【问题标题】:JS browser: check if error generated by getUserMedia() is a DOMException error objectJS浏览器:检查getUserMedia()产生的错误是否是DOMException错误对象
【发布时间】:2020-04-22 18:03:13
【问题描述】:

我想知道是否由于 getUserMedia() 函数或 webRTC 函数而在以下 Promise 链中生成了错误。 Firefox documentation 说:通过将 DOMException 错误对象传递给 Promise 的失败处理程序来拒绝返回的 Promise。那么,我如何知道我得到的错误对象是否是 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()
  });
}

【问题讨论】:

    标签: javascript browser error-handling getusermedia


    【解决方案1】:

    这样做的正确方法不是查看错误对象,而是在流程中的正确位置捕获错误。

    例如你可以有

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

    这样,您仍然可以通过检查 gumErrored 标志是否为真来处理最终的捕获(假设这是您想要的),但可以确定错误的来源。

    (你可以通过将return myPeerConnection.createAnswer() 带入同一个区块来跳过链中的一个承诺)

    【讨论】:

    • 如果我在第一个 then() 方法之后使用 catch() 方法捕获错误,与您的解决方案有何不同?
    • 没有区别
    猜你喜欢
    • 1970-01-01
    • 2019-12-16
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多