2011-09-21 7 views
14

WebWorkerは、従来のJavaScriptの 'ウィンドウ'コンテキストとは完全に別のスコープで実行されます。スクリプトがWebWorkerとして実行されているかどうかを判断する標準的な方法はありますか?JavaScriptがWebWorkerとして実行されているかどうかを検出するための標準的なメカニズムはありますか?

私が考えることができる最初の 'ハック'は、ワーカーの範囲に 'ウィンドウ'プロパティがあるかどうかを検出することです。存在しない場合、これはWebWorkerとして実行されている可能性があります。

追加のオプションは、標準の 'ウィンドウ'コンテキストに存在しないプロパティを検出することです。クローム14の場合、このリストには、現在含まれています:

FileReaderSync 
FileException 
WorkerLocation 
importScripts 
openDatabaseSync 
webkitRequestFileSystemSync 
webkitResolveLocalFileSystemSyncURL 

検出WorkerLocationは、実行可能な候補のように思えるが、これはまだ少しハック感じています。より良い方法がありますか?

EDIT:Hereは、実行中のWebWorkerに存在する「ウィンドウ」にあるプロパティを判別するために使用するJSFiddleです。

+4

「ウィンドウ」を確認できないのはなぜですか? –

+0

'!(typeof window ==" object "&& typeofドキュメント==" object "&& window.document ===ドキュメント)'? –

答えて

12

specは言う:

DOMのAPI(Nodeオブジェクト、ドキュメントオブジェクトなど)は、この仕様書のこのバージョンでは、労働者には利用できません。

これは、documentが存在しないことを確認することが、あなたが職場にいるかどうかを確認する良い方法です。あるいは、WorkerGlobalScopeの存在を確認することもできますか?

0

これが私の作品:

if (self instanceof Window) { 
    // not in worker 
} 
+0

しかし、それは 'self'と' Window'の両方が定義されていないワーカーを投げますか? – Bergi

+1

いいえ、ワーカーでは、selfはWorkerGlobalScopeのインスタンスです – mbelow

+1

ああ、そうですが、 'Window'はまだ' undefined'であり、 'instanceof'はそのためにスローされます。 – Bergi

2

少し古い投稿が、Asynchronous.jsライブラリ(非同期/並列プロセスの一般的な取扱いのためのライブラリ、作者)で使用されているどのような一般的な選択肢 のカップルをされる追加次

// other declarations here 
,isNode = ("undefined" !== typeof global) && ('[object global]' === Object.prototype.toString.call(global)) 
// http://nodejs.org/docs/latest/api/all.html#all_cluster 
,isNodeProcess = isNode && !!process.env.NODE_UNIQUE_ID 
,isWebWorker = !isNode && ('undefined' !== typeof WorkerGlobalScope) && ("function" === typeof importScripts) && (navigator instanceof WorkerNavigator) 
,isBrowser = !isNode && !isWebWorker && ("undefined" !== typeof navigator) && ("undefined" !== typeof document) 
,isBrowserWindow = isBrowser && !!window.opener 
,isAMD = "function" === typeof(define) && define.amd 
,supportsMultiThread = isNode || "function" === typeof Worker 
,isThread = isNodeProcess || isWebWorker 
// rest declarations here.. 
0

もっとあります:など

WorkerNavigatorがありますない限り、キーワードを使ってWebワーカーを検出するには、変数を使用する必要があります。 (何も変数を設定または交換からあなたのスクリプトの前に実行されている不正なスクリプトを停止することはできません。)

をので、これらの行のいずれかが動作しますが、あなたがあなたのスクリプトの前に実行されている任意の不正なスクリプトを持っていないと仮定すると:

this.DedicatedWorkerGlobalScope?this.__proto__ === this.DedicatedWorkerGlobalScope.prototype:false 

this.WorkerGlobalScope?this.__proto__.__proto__ === this.WorkerGlobalScope.prototype:false // works for shared workers too 

this.constructor === this.DedicatedWorkerGlobalScope //or SharedWorkerGlobalScope 

!(this.DedicatedWorkerGlobalScope === undefined) 

!(this.DedicatedWorkerGlobalScope === undefined) 

thisの代わりにself§を使用することもできますが、thisは設定できません。


私が好む:もちろん

this.DedicatedWorkerGlobalScope !== undefined 

を、あなただけの労働者の状況やウィンドウのコンテキストを持っている場合、あなたはウィンドウのコンテキストのための逆のテストを行うことができます。例えばthis.Window === undefined

+0

廃止予定の '__proto__'を使用しないでください。 'Object.getPrototypeOf()'か '.isPrototypeOf'か' instanceof'のどちらかを使います。 – Bergi

関連する問題