没有使用承诺 async / await 要求 手动传播错误 并检查他们。
async
await
添加一个 catch 例如在这里看错误:
catch
this.pc1.createOffer({offerToReceiveAudio: 1, offerToReceiveVideo: 1}) .then(this.gotDescription) .catch(e => console.log(e)); // <-- here
......你应该看到 this 是 undefined 内 gotDescription() 。那是因为你将一个成员函数作为回调函数传递给了 then 函数,最终在没有的情况下调用它 this 。要么使用 this.gotDescription.bind(this) 或(更好)箭头功能。例如。:
this
undefined
gotDescription()
then
this.gotDescription.bind(this)
this.pc1.createOffer({offerToReceiveAudio: 1, offerToReceiveVideo: 1}) .then(offer => this.gotDescription(offer)) // arrow function invoking on this .catch(e => console.log(e));
此外,除非你 回报所有的承诺 ,他们不会形成一个单一的链来捕捉所有的错误。
所有这些调用都会返回承诺,你忽略了:
/* const unusedPromise1 = */ this.pc1.setLocalDescription(description) /* const unusedPromise2 = */ this.pc2.setRemoteDescription(description) /* const unusedPromise3 = */ this.pc2.createAnswer().then(this.gotDescription2)
幸运的是(也许是令人困惑的), RTCPeerConnection 自动对在其上完成的操作进行排队,因此这可能实际上有效,前提是没有错误,可能会被吞下,具体取决于浏览器。
相反,要捕获错误,请执行以下操作:
this.pc1.setLocalDescription(description) .then(() => this.pc2.setRemoteDescription(description)) .then(() => this.pc2.createAnswer()) .then(answer => this.gotDescription2(answer)) .catch(e => console.log(e))
或使用更好的 async / await 正确传播错误的语法:
gotDescription: async function (description) { console.log('Got description 1') await this.pc1.setLocalDescription(description) await this.pc2.setRemoteDescription(description) await this.gotDescription2(await this.pc2.createAnswer()); }