RTCDataChannel send()是一个同步/阻塞调用吗?

Is RTCDataChannel send() a synchronous/blocking call?

本文关键字:调用 一个 send RTCDataChannel 同步      更新时间:2023-09-26

我试图通过WebRTC发送一个文件块,我想知道我是否可以创建一个回调函数,在RTCDataChannel.send()完成发送文件的每个块后调用。

RTCDataChannel.send()是同步/阻塞呼叫吗?如果是,我的回调可以在.send()之后的行执行。

如果.send()是异步/非阻塞,那么这将变得棘手,因为它似乎不像.send()接受回调函数,我想避免使用缓冲区和超时。

send方法阻塞。但是,它并不等待数据通过网络,而只是将数据放在内部缓冲区中,以后(或在脚本执行的同时)可能会从该缓冲区发送数据。

未传输的数据量作为bufferedAmount属性可用,该属性将在每次send()调用时同步增加(并且在下一次事件循环转之前不会更新)。

因此,您可以使包装器异步,并在实际调用send()之前设置一个超时,当当前缓冲的数据"太多"时(根据您认为合适的任何标准)。

如上所述,send()实际上是异步的-您不会获得交付收据。然而,有一个回调onbufferedamountlow,当调用通道的发送缓冲区低于bufferedAmountLowThreshold设置的值(见MDN onbufferedamounflow)

你可以使用这个回调来决定何时发送下一个块。

请注意,这是相对较新的标准草案,可能不是所有地方都支持。