31

postMessage()通常のファイルを参照できないため、を介して1つまたは複数の関数をWebワーカーに渡したいと思います。

Webワーカーを開始するために、(Blobから作成された)オブジェクトURLをWorkerコンストラクターに渡します。次に、メッセージを渡しますが、これまでのところ、メッセージに関数を入れることはできません。

(JSON)メッセージに関数を直接含めることはできません(ここで規定されています)。importScriptsは理論的には許可されていますが、これまでChromeまたはFirefoxで使用することはできませんでした。

htmlファイルの本文:

<div id="divText">1234</div>
<script>
    var greeter = function greet(name) {
        return "hello " + name;
    };
    function webWorkerWorker() {
        self.postMessage("started1");
        self.onmessage = function(event) {
            importScripts(event.data.content);
            self.postMessage("importScripts success");
            var result = greeter("john");
            self.postMessage(result);
        };
    }
    var functionBody = mylib.extractFunctionBody(webWorkerWorker);
    var functionBlob = mylib.createBlob([functionBody]);
    var functionUrl = mylib.createObjectURL(functionBlob);

    var functionBody2 = mylib.extractFunctionBody(greeter);
    var functionBlob2 = mylib.createBlob([greeter]);
    var functionUrl2 = mylib.createObjectURL(functionBlob2);

    var worker = new Worker(functionUrl);
    worker.onmessage = function(event) {
        document.getElementById("divText").innerHTML = event.data;
    }
    worker.postMessage({
                type: "init",
                content: functionUrl2
            });
</script>

現在、divText値が「importScriptssuccess」に設定されています。

私は何か間違ったことをしていますか?関数をWebワーカーに渡すことができる別の方法はありますか?それとも不可能ですか?

4

3 に答える 3

10

このメソッドは問題なく動作することがわかりました。ワーカーにバグがあっただけです。

var result = greeter("john");

する必要があります

var result = greet("john");

これは理にかなっています-私はグリーター変数をワーカーに渡していますが、私が渡しているオブジェクトの変数名を知る理由はありません。

于 2012-08-13T15:54:25.390 に答える