Tri*_*nko 10 javascript asynchronous blocking websocket
如果我通过其方法发送一个大型Blob
或ArrayBuffer
多个JavaScript ...该方法是否调用阻塞直到数据被发送,或者它是否将数据的副本异步发送以便调用可以立即返回?WebSocket
send
send
根据我的解释,一个相关的(未答复的)问题是,快速的一系列发送是否会导致onmessage事件被延迟,正如有人似乎在Mobile Safari中描述的那样:移动Safari 上的JavaScript websocket中的表观阻塞行为
根据bufferedAmount
属性的描述,我推断send
必须立即返回,因为否则bufferedAmount
将始终为零.如果它不为零,则必须有先前调用send缓冲的数据,如果发送缓冲数据,则没有理由阻止它.
来自http://dev.w3.org/html5/websockets/
该bufferedAmount属性必须返回已使用排队应用程序数据(UTF-8文本和二进制数据)的字节数send()方法,但是由于最后一次事件循环开始执行任务时,尚未发送到网络.(因此,这包括在执行当前任务期间发送的任何文本,无论用户代理是否能够与脚本执行异步传输文本.)这不包括协议产生的帧开销,或操作系统执行的缓冲或网络硬件.如果连接已关闭,则此属性的值仅在每次调用send() 方法时都会增加(一旦连接关闭,该数字不会重置为零).
在这个简单的示例中,bufferedAmount属性用于确保以每50ms一次更新的速率发送更新,如果网络可以处理该速率,或者网络可以处理的任何速率,如果速度太快.
var socket = new WebSocket('ws://game.example.com:12010/updates');
socket.onopen = function () {
setInterval(function() {
if (socket.bufferedAmount == 0)
socket.send(getUpdateData());
}, 50);
};
Run Code Online (Sandbox Code Playgroud)
该bufferedAmount属性还可以用于饱和的网络,而在更高的速度比网络能够处理发送数据,虽然这需要一段时间的属性值的更仔细的监测.