如果我通过JavaScript WebSocket
的send
方法发送一个大的Blob
或ArrayBuffer
。。。send
方法是在发送数据之前进行阻塞,还是制作一份异步发送的数据副本,以便调用可以立即返回?
一个相关的(未回答的)问题是,从我的解释来看,一系列快速的发送是否会导致onmessage事件延迟,就像有人描述的那样:移动Safari 上JavaScript websocket中的明显阻塞行为
根据bufferedAmount
属性的描述,我推断出send
必须立即返回,因为否则bufferedAmount
将始终为零。如果它是非零的,那么必须有来自先前调用的缓冲数据才能发送,如果发送缓冲数据,那么就没有理由阻止它。
发件人http://dev.w3.org/html5/websockets/
bufferedAmount属性必须返回已排队的应用程序数据(UTF-8文本和二进制数据)使用send(),但截至事件循环上次启动时执行任务的消息尚未被发送到网络。(这个从而包括在执行当前任务期间发送的任何文本,无论用户代理是否能够传输文本与脚本执行异步。)这不包括框架协议产生的开销,或操作完成的缓冲系统或网络硬件。如果连接关闭属性的值只会随着对send()的每次调用而增加方法(一旦连接关闭,数字不会重置为零)。
在这个简单的示例中,bufferedAmount属性用于确保如果网络可以处理该速率,或者以网络可以处理的任何速率把手,如果太快的话。
var socket = new WebSocket('ws://game.example.com:12010/updates');
socket.onopen = function () {
setInterval(function() {
if (socket.bufferedAmount == 0)
socket.send(getUpdateData());
}, 50);
};
bufferedAmount属性也可用于使网络饱和在不以高于网络所能处理的速率发送数据的情况下,尽管这需要随着时间的推移对属性的值进行更仔细的监控。