SharedWorker加载竞争条件

时间:2015-02-01 21:54:19

标签: javascript web-worker

我想我可能对共享网络工作者的行为有误解,但我在规范或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毫秒,它每次都几乎。这是一种可行的,但非常不可靠的解决方法。

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

0 个答案:

没有答案