19

私は現在、JavaScriptで小さなライブラリを作成して、Webワーカーに重い計算を委任できるようにしています。

いくつかの理由で(主にUIスレッドでデバッグしてから、ワーカーで同じコードを実行する機能のために)、スクリプトが現在ワーカーで実行されているのか、UIスレッドで実行されているのかを検出したいと思います。

私は経験豊富なJavaScript開発者ではないので、次の関数が私がワーカーにいるかどうかを確実に検出できるようにしたいと思います。

function testenv() {
    try{
        if (importScripts) {
            postMessage("I think I'm in a worker actually.");
        }
    } catch (e) {
        if (e instanceof ReferenceError) {
            console.log("I'm the UI thread.");
        } else {
            throw e;
        }
    }
}

それで、それはありますか?

4

3 に答える 3

46

これについてはゲームにかなり遅れていますが、これが私が思いつくことができる最高の、最も防弾の方法です:

// run this in global scope of window or worker. since window.self = window, we're ok
if (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope) {
    // huzzah! a worker!
} else {
    // I'm a window... sad trombone.
}
于 2013-08-01T19:18:45.127 に答える
14

Emscriptenは:

// *** Environment setup code ***
var ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof require === 'function';
var ENVIRONMENT_IS_WEB = typeof window === 'object';
var ENVIRONMENT_IS_WORKER = typeof importScripts === 'function';
var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER;

GithubのEmscripten

于 2014-05-12T22:07:16.507 に答える
10

前述のように、ウィンドウにドキュメントオブジェクトが存在するかどうかを確認するという回答が別のスレッドにあります。ただし、Chromeや他のブラウザでもJSの実行が遅くなるtry / catchブロックを回避するために、コードを変更したいと思いました。

編集:以前、グローバルスコープにウィンドウオブジェクトがあると想定してエラーを起こしました。私は通常追加します

//This is likely SharedWorkerContext or DedicatedWorkerContext
window=this;

これにより、ワーカーローダースクリプトの先頭に、ウィンドウ機能の検出を使用するすべての関数が機能しなくなります。次に、以下の機能を使用できます。

function testEnv() {
  if (window.document === undefined) {
    postMessage("I'm fairly confident I'm a webworker");
  } else {
    console.log("I'm fairly confident I'm in the renderer thread");
  }
}

または、最上位のスコープにある限り、ウィンドウの割り当てはありません。

var self = this;
function() {
  if(self.document === undefined) {
    postMessage("I'm fairly confident I'm a webworker");
  } else {
    console.log("I'm fairly confident I'm in the renderer thread");
  }
}
于 2012-08-16T02:12:02.447 に答える