2

Java(OOP)の世界から来て、私はクラス、継承、マルチスレッドに慣れています。 JavaScriptドメインで少し歩いていたら、これらのパラダイムとパターンを適用してみましょう。読み込み:プロトタイプ(「クラス」/オブジェクト)とWebWorkersを並列実行に使用します。労働者を開始しかし、この1ケースは動作しません...オブジェクトを定義するときに(JavaScript)ワーカーでこれを使用できないのはなぜですか?

HTMLサイト:HTML( "worker.js")によって呼び出さ

<html> 
    <head> 
     <script> 
     var worker = new Worker("worker.js"); 
     worker.onmessage(event) { 
      // here be fancy script 
     } 
     worker.postMessage("run, worker, run!"); 
     </script> 
    </head> 
    ... 
</html> 

ワーカー:

self.loadScripts("handler.js"); 
var handler = null; 
self.onmessage = function(event) { 
    if(!handler) { 
     handler = new Handler(); 
    } 

    handler.compute(); 
} 

ハンドラとして

function Handler() { 
} 

Handler.prototype = { 
    compute: function() { 
     this.doSomething(); // <-- ERROR! "this" points to the worker context, 
          // not to the Handler instance. So "doSomething" is 
          // undefined. However, the following line would work: 
     // Handler.prototype.doSomething(); 
    }, 
    doSomething: function() { 
     // More code here 
    } 
} 

JavaScriptプロトタイピングと "継承"はこのように動作することを意味していますか?私はいつもこれの代わりにプロトタイプのプロパティを使うべきですか?関数の代わりにthis.myPropertyにアクセスしたいのですが?

また、これをコンストラクタ内のHandlerインスタンスにバインドする方法はありますか?少なくとも、コードは長いHandler.prototype参照で煩雑ではありません。

ありがとうございます!

+0

あなたは[コンテキストを渡す]必要があると思う(https://developer.mozilla.org/ja/JavaScript/Reference/Global_Objects/Function/call)。そうでなければ、 'this'はグローバルスコープが何であっても参照する。 –

+0

私はそれがうまくいくように思えます(私はWebWorkersにあまり慣れていませんが)。関連するコードがありませんか? 'compute'関数の' this'は、呼び出された 'handler'オブジェクトでなければなりません。 – RightSaidFred

+0

私はコードがWebワーカーの外で動作することを確認してから、何か明白なものを見逃さないようにすることをお勧めします。次に、Webワーカーに配置してテストします。オブジェクトのメソッドを呼び出すときには、 'this'をオブジェクトに設定して、期待しているようにコード内に何か問題があります(私は現時点では見ていません)。 – jfriend00

答えて

0

ご意見ありがとうございます。確かに、これのコンテキストは期待通りに機能します。実際のコードは、タイムアウトのコールバックを使用:

Handler.prototype = { 
    compute: function() { 
     self.setTimeout(this.doSomething, 1000); // Here the this got lost 
    }, 
    doSomething: function() { 
     // Code here 
    } 
} 

タイムアウト呼び出しから、これは労働者のコンテキストを参照しているようです。 (jfriend00が示唆したように、変数として呼び出し側を参照)問題を解決するために、私は匿名関数でコールバックを包んだ:

Handler.prototype = { 
    compute: function() { 
     var caller = this; 
     self.setTimeout(function() { // Wrap for great justice 
      caller.doSomething(); 
      } , 1000); 
    }, doSomething: function() { 
     // Code here 
    } 
} 

おかげで再び。

関連する問題