Workerをちょっとだけさわった。
ちょっとWorkerを使ってみようかと思って試してみた。
使い方
var worker = new Worker("worker.js");
みたいにする。
workerにお仕事してもらう内容は、worker.jsって別ファイルに記述する。
worker.js
onmessage = function (evt) { var data = evt.data //お仕事 }
onmessageイベントをトリガーに処理をさせるらしい。
で、workerと呼び出し元の親とのやり取りは
worker.postMessage(/* 渡したいデータ */);
みたくする。
受け取りはeventオブジェクトのdataプロパティから取り出せる。
どうやらここで渡せるのはchromeだと文字列になってしまうらしい。
なので、objectをわたすと[object object]になってしまう。
FFだとうまくいった。
あとそもそもFunctionは渡せない。
データの受け渡しならJSON.stringifyとJSON.parseをかませて
受け渡すようにすればどうにか解消される。
応用編?
用途や処理内容によると思うけど、
1worker(ファイル)に複数のお仕事ができるようにさせてみる
(そもそも、workerは重い処理をさせる想定でこういったつくりになっているから
今からやるやり方は正しいやり方(使い方?)とはいえないと思う)
workerで足し算してみる(本来はこんな軽い処理で使わないけど)
var worker = new Worker("worker.js"); worker.postMessage([2, 3]); worker.onmessage = function (evt) { alert(evt.data); };
worker.js
onmessage = function (evt) { postMessage(evt.data[0] + evt.data[1]); };
これに引き算もできるようにしてみる
var worker = new Worker("worker.js"); worker.postMessage(["add", 2, 3]);// 足し算 worker.postMessage(["sub", 2, 3]);// 引き算 worker.onmessage = function (evt) { alert(evt.data); };
worker.js
var works = { "add": function (a, b) { return a + b; }, "sub": function (a, b) { return a - b; } }; onmessage = function (evt) { var data = evt.data; var work = data.shift(); var args = data; if (works[work]) { postMessage(works[work].apply(this, args)); } else { postMessage(null); } };
こうすれば割とできる。
これだと何の結果が戻ってきているのかわからないので
worker.js同様なんらかの目印をつけて処理を分岐する必要はある。
とりあえずこんな感じだ。
workerは呼び出し側とworker側で似たようなことを書かないと
いけないのがちょっと不便と感じた。