2016-04-18 14 views
-1

Webワーカーに迷惑をかけていましたが、呼び出されたときにワーカーで作業を実行できるかどうかを判断するクラスを作成しようとしています。これまでのところ、私は次のような機能を期待しています。このウィンドウが存在するかどうかがチェックされると、Webワーカーは例外をスローしています

workerClass.workRequest("Hello"); 

私の質問は以下に関するなどと呼ば

var workerClass = { 
    getInstance: function() { 
     console.log("-- INSTANCE REQUESTED --") 
     // If we have a worker we have an instance return this. 
     if (this.worker !== undefined) return this.worker; 
     console.log("-- INSTANCE NOT CACHED --") 

     //var 
     // iAmWorker = window === undefined, 
     // iCanBeAWorker = iAmWorker ? true : window.Worker !== undefined; 

     var 
      iAmWorker = false, 
      iCanBeAWorker = false; 
     try{ 
      iAmWorker = window === undefined 
      iCanBeAWorker = iAmWorker ? true : window.Worker !== undefined; 
     } 
     catch(e){ 
      iAmWorker = true; 
      iCanBeAWorker = true; 
     } 

     if (!iAmWorker && iCanBeAWorker){ 
      console.log("-- I AM NOT IN A THREAD - SPAWNING ONE --") 
      this.worker = { 
       obj: new Worker("worker.js"), 
       callFunc: function(funcName, Args){ 
        // MAKE REQUEST 
        this.obj.postMessage([funcName,Args]); 
        this.obj.onmessage = function(e) { 
         console.log('-- MESSAGE RECEIVED FROM WORKER THREAD --'); 
         console.log(e.data); 
         // COMPLETE DEFFERED OBJ 
        }; 
        // RETURN DEFFERED OBJ 
       } 
      } 
      console.log("-- I AM IN A THREAD --") 
     }else{ 
      // Actual Worker object regardless of in a thread or not 
      this.worker = { 
       obj: this, 
       callFunc: function(funcName, Args){ 
        return this.obj[funcName](Args); 
       } 
      } 
     } 

     return this.worker; 
    }, 

    // Return a Deferred Object 
    workRequest: function(content){ 
     return this.getInstance().callFunc("actualWork",[content]); 
    }, 

    // Actual Work 
    actualWork: function(content){ 
     console.log("-- SIMULATING SOME WORK --") 

     var dt = new Date(); 
     while ((new Date()) - dt <= 3000) { /* Do nothing */ } 
     console.log("-- SIMULATED WORK DONE --"); 

     return content + " world"; 
    } 
} 

// NOTE ONLY EVER TO BE USED IN A WORKER 
onmessage = function(args) { 
    postMessage(workerClass.getInstance().callFunc(
     args.data[0], 
     args.data[1] 
    )); 
} 

。私は労働者の中に窓がないことを知っています。したがって、その存在をチェックする私の試み。

var 
    iAmWorker = window === undefined, 
    iCanBeAWorker = iAmWorker ? true : window.Worker !== undefined; 

これは私がキャッチする必要が例外をスローし、私はこれは醜いと愚か見つけます。このテストを実装するにはより良い方法がありますか?

乾杯と感謝。

+0

@Xufoxそれはウィンドウに例外をスローする===未定義のチェックと子のアクセッサー – Spaceman

+1

[JavaScriptで定義されていない変数をチェックする方法]の可能な複製(http://stackoverflow.com/questions/858181) /どのように - チェック - 未 - 定義されている変数の - JavaScriptで) – Xufox

+0

@Xufoxあなたがリンクした投稿のように未定義のコードをチェックしているのを確認すると、@Xufoxは私のことを思っていません。 – Spaceman

答えて

1

変数は例外のいずれかのリスクなしに、現在のスコープで定義されているかどうかを確認する安全な方法は、typeofを使用している:

if (typeof window !== "undefined") { 
    // code that references window 
} else { 
    // code that does not reference window 
} 

または、おそらく特定の種類の確認:

if (typeof window === "object") { 
    // code that references window 
} else { 
    // code that does not reference window 
} 
+0

あなたはちょうどちょうど私が台無しにしたようにちょっとdupを閉じて投票に行くつもりです。 – Spaceman

+0

@Spaceman - あなたはあなた自身の質問を閉じるために投票しません。それを取り除きたい場合は、 "削除"ボタンを使用してください。 – jfriend00

+0

ありがとうございました。ありがとうございました。今度は削除してください:) – Spaceman

関連する問題