18

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

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

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

FileReaderSync
FileException
WorkerLocation
importScripts
openDatabaseSync
webkitRequestFileSystemSync
webkitResolveLocalFileSystemSyncURL

WorkerLocationの検出は実行可能な候補のように見えますが、それでも少しハックな感じがします。もっと良い方法はありますか?

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

4

5 に答える 5

15

仕様は次のように述べています。

この仕様のこのバージョンでは、ワーカーは DOM API (Node オブジェクト、Document オブジェクトなど) を使用できません。

これは、 が存在しないことdocumentを確認することが、ワーカー内にいることを確認する良い方法であることを示唆しています。WorkerGlobalScopeまたは、 ?の存在を確認してみてください。

于 2012-01-09T08:05:59.450 に答える
3

少し古い投稿ですが、いくつかの一般的な代替手段を追加します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..
于 2015-11-13T16:20:17.060 に答える
0

これは私のために働く:

if (self instanceof Window) {
    // not in worker
}
于 2014-08-29T14:48:24.713 に答える