2012-05-14 8 views
15

Webワーカーで新しいメッセージを同期的に待機するかどうかを確認する方法はありますか?Web-Workerでメッセージを同期的に待機する

私は、コールバックの周りでリファクタリングすることができない大きな複雑なコード(emscriptenからコンパイルされたLLVM)を持っています。

UIスレッドからメッセージを受信して​​処理するまで、特定の行の後のコードが実行されないようにする必要があります。 whileループでブロックすると、イベントループが実行されないため、メッセージを受信できません。

+0

ECMAScriptが 'call-with-continuation'を持つSchemeのような豊富な言語だった場合、あなたの問題に対する解決策があります。これにより、現在の継続をキャッチし、 'onmessage'ハンドラで再度呼び出すことができます。 – Marc

答えて

0

いいえ、残念ですが、親ページからのメッセージをブロックする方法を追加する議論がいくつかありましたが、どこにも行きませんでした。関連するメーリングリストのスレッドを掘り下げることができるかどうかがわかります。

1

リファクタリングなしでシーケンスを次のように分割できますか?最初のステップの実行スタックが完了するまで

wrk.onmessage = function(e) { 
    if (e.data.step === 'initial input') { 
     doInitialWork(e.data.inputs) 
    } else if (e.data.step === 'ui input') { 
     doTheRest(e.data.uiData) 
    } 
} 

のonMessageイベント

がブロックされるとの情報が利用可能になったときと場合、重要なUIビットのみが起動します。

0

これを行うには、FileSystem APIなどの同期APIを使用し、一時的なファイルを同期メカニズムとして使用することが重要です。

例では、emscriptenコードはファイルに対して同期読み取りを実行し、UIスレッドは同じファイルに書き込み、ワーカーを効果的にブロック解除できます。

関連する問題