我想我可能对共享网络工作者的行为有误解,但我在规范或MDN(等)中找不到任何澄清的内容。
测试用例:
HTML:
<!DOCTYPE html><html lang="en-gb"><head>
<meta charset="UTF-8" />
<title>Simple Worker Test</title>
<script type="text/javascript">
window.addEventListener( 'load', function( ) {
var sharedWorker = new SharedWorker( 'worker.js' );
sharedWorker.port.addEventListener( 'message', function( e ) {
console.log( e.data );
}, false );
sharedWorker.port.start( );
sharedWorker.port.postMessage( 'ping' );
setTimeout( function( ) {
sharedWorker.port.postMessage( 'pong' );
}, 2000 );
}, false );
</script>
</head><body></body></html>
worker.js:
onconnect = function( e ) {
var port = e.ports[0];
port.onmessage = function( e ) {
port.postMessage( 'echo: ' + e.data );
};
};
当我运行它(在Chrome 40中)并刷新页面几次时,通常我会看到&#34; echo:ping&#34;在控制台中(以及后来的#34; echo:pong&#34;),但大约三分之一的时间我都看不到。这对我来说感觉就像一场竞争条件,但我的印象是postMessage
(和port.start)会将请求排队,直到工作人员准备就绪(即加载并运行)。在使用非共享员工时,我不会看到这个问题。
更新:如果我将整个事物包装在setTimeout(...,100)
而不是(或者除了)加载侦听器中,它每次都有效。如果我使用50毫秒而不是100毫秒,它每次都几乎。这是一种可行的,但非常不可靠的解决方法。
我错过了什么吗?在设置端口之前,我应该等待某种类型的事件吗?