JavaScript WebSocket.send方法是否阻止?

时间:2013-08-15 05:13:47

标签: javascript asynchronous websocket blocking

如果我通过Blob方法向JavaScript ArrayBuffer发送大WebSocketsend ... send方法调用阻塞直到发送数据,或者是否将数据副本异步发送以便调用可以立即返回?

根据我的解释,一个相关的(未答复的)问题是,一系列快速发送是否会导致onmessage事件被延迟,正如有人似乎在Mobile Safari中描述的那样:Apparent blocking behaviour in JavaScript websocket on mobile Safari

1 个答案:

答案 0 :(得分:6)

根据 bufferedAmount 属性的说明,我推断 send 必须立即返回,否则 {{ 1}} 永远为零。如果它不为零,则必须有先前调用send缓冲的数据,如果发送缓冲数据,则没有理由阻止它。

来自http://dev.w3.org/html5/websockets/

  

bufferedAmount 属性必须返回的字节数   已排队的应用程序数据(UTF-8文本和二进制数据)   使用 send()但是,从上次启动事件循环开始   执行任务,尚未传输到网络。 (这个   因此包括在执行当前任务期间发送的任何文本,   无论用户代理是否能够传输文本   与脚本执行异步。)这不包括框架   协议产生的开销,或操作完成的缓冲   系统或网络硬件。如果连接关闭,这个   属性的值只会在每次调用 send()时增加   方法(连接关闭后,数字不会重置为零)。

     

在这个简单的示例中, bufferedAmount 属性用于确保   如果更新是以每50ms一次更新的速率发送的   网络可以处理该速率,或者无论网络速率如何   处理,如果太快。

bufferedAmount
  

bufferedAmount 属性也可用于使网络饱和   没有以比网络可以处理的更高的速率发送数据,   虽然这需要在一段时间内更仔细地监控属性的值。