Javascript SharedWorker加载竞态条件

Javascript SharedWorker加载竞态条件,javascript,web-worker,Javascript,Web Worker,我想我可能对共享web工作人员的行为有误解,但我在规范或MDN等中找不到任何澄清的东西 测试用例: HTML: 当我在Chrome40中运行它并刷新页面几次时,通常我会在控制台中看到echo:ping,稍后会看到echo:pong,但大约三分之一的时间我都看不到。对我来说,这感觉像是一种竞争条件,但我的印象是,postMessage和port.start会将请求排队,直到worker准备就绪,即加载并运行。在使用非共享工作人员时,我看不到这个问题 更新:如果我用setTimeout…,100而不

我想我可能对共享web工作人员的行为有误解,但我在规范或MDN等中找不到任何澄清的东西

测试用例:

HTML:

当我在Chrome40中运行它并刷新页面几次时,通常我会在控制台中看到echo:ping,稍后会看到echo:pong,但大约三分之一的时间我都看不到。对我来说,这感觉像是一种竞争条件,但我的印象是,postMessage和port.start会将请求排队,直到worker准备就绪,即加载并运行。在使用非共享工作人员时,我看不到这个问题

更新:如果我用setTimeout…,100而不是or以及load listener来包装整个过程,它每次都能工作。如果我用50毫秒而不是100毫秒,它几乎每次都能工作。所以这是一个可能的,但非常不可靠的解决办法


我错过什么了吗?在设置端口之前,我是否应该等待某种类型的事件?

我已经设置了一个Plunkr,试图重新创建您的问题。在我的Linux Chrome38系统上,有时看起来两条乒乓球信息都没有显示出来。我也不知道为什么。
<!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>
onconnect = function( e ) {
    var port = e.ports[0];
    port.onmessage = function( e ) {
        port.postMessage( 'echo: ' + e.data );
    };
};