0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

WebWorker

Last updated at Posted at 2020-02-05

WebWorkerのお勉強。

まずは最小限のコードでWebWorkerを動かしてみる。
任意のデータをワーカーに渡して、オウム返しして表示するだけ。

メインスレッド
const worker = new Worker('worker.js')
worker.onmessage = event => console.dir(event.data)
worker.postMessage([1,2,3])
worker.js
onmessage = event => postMessage(event.data)

インラインworker

worker.jsが外部ファイルなのが気に入らない場合は、内部化できる。

クラスを文字列化し、それをBlob・URL化すれば、worker.jsの代わりになる。
クラスは、ワーカーのコンテキストで動作することに注意すれば普通に書ける。

ワーカーは非同期処理なので、プロミス化するのが好手。
データはクラスのコンストラクタに渡され、コンストラクタの戻り値がプロミスの値となる。

これら一連の処理を関数化したのが、次の関数である。

使い方
const workerが返す値 = await inlineWorker(worker化するクラス, workerに渡すデータ)
function inlineWorker(fn, data){
    const code = `onmessage = event => postMessage(new ${fn.toString()}(event.data))`
    const blob = new Blob([code], {type: 'text/javascript'})
    const url  = URL.createObjectURL(blob)

    function async(ok, ng){
        const worker = new Worker(url)
        worker.onmessage = event => ok(event.data)
        worker.onerror   = event => ng(event)
        worker.postMessage(data)
    }
    return new Promise(async)
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?