私はJavaScriptは、本質的にシングルスレッドであり、一般的にいくつかのデータは、メインスレッドから利用可能になるまでのコールスタックを破壊せずに待つようにWebWorkerを取得する方法があれば、私は疑問に思ってそのようなことによりしかめ面を理解しながらWebWorker。WebWorkerから同期してデータを取得しますか?
これは楽しいプロジェクトのためにあるように、私は確実に古いブラウザでは動作しません、と私は限り、彼らは仕事として難解なハックを気にしない新技術やものを使用することができます。
私が考えているいくつかの他のソリューション:データが所定のキーであるまでループで
連続世論調査のlocalStorage。これは、LocalStorageのスレッドセーフに関するすべてのdiscussionsから判断し、同じLocalStorageキーに複数のタブを書き込むことによって、ループ内でポーリングされても、他のスレッドによるLocalStorageの更新を現在のスレッドで見ることができるからです。このアプローチの欠点は、実際には「待機」していない、つまりワーカースレッドがLocalStorageでCPU使用率を完全に消費していることです。 LocalStorageは通常ロックで実装されますが、長期間LocalStorageロックを保持することはできません(ロックは
getItem
またはsetItem
が返された後で解放されます)。のECMAScript 6
yield
。これは、呼び出しスタック内のすべての関数(生成したい場所がジェネレータ関数としてマークされるまで)を必要とするため、ここでは機能しません。 WebWorkerを一時停止したい場所に、WebAssembly関数を含むコールスタックがあります。この関数はジェネレータ関数としてマークすることはできません。IndexedDB。 IndexedDBは同期要求をサポートしていないため、これは機能しません。
私はthis同様の問題を認識していますが、その質問には、具体的onmessage
イベントについて語っとyield
とWebAssemblyが導入される前、2012年に頼まれました。
WebWorkerスレッドのロックを何らかの形でシミュレートする方法はありますか?そうでなければ、データが利用できるようになるまで待つ方法はありますか?
タイトルは、WebWorkerから同期的にデータを取得するよう求めていますが、WebWorkerがいわゆるメインからどのようにデータを取得できるかを質問しています。 –
私はこの質問の表現に問題があるとは思わない。 「from」の意味は、「WebWorker」を場所または人/オブジェクトとして使用するかどうかによって異なります。タイトルは「WebWorker」を場所として使用します。 「遠くから見る」または「家からのコンテストに参加する」.WebWorkerにあるコードが何かをやろうとしている(この場合はデータを取得する)。あなたはオブジェクトとして "WebWorker"を使用しています。 "瓶からクッキーを取る"、エージェント/オブジェクトには、取得したいものがあります。私は「WebWorkerデータを同期して取得する」と書いたことがあります。あなたの質問をしたいと思ったら。 – Bernard
right ...レッスンありがとう...非同期タスクを同期して実行しないでください –