Mat*_*att 15 javascript html5 web-worker
WebWorker使用与传统JavaScript的"窗口"上下文完全分离的范围执行.是否有一种标准方法可以让脚本确定它本身是作为WebWorker执行的?
我能想到的第一个"黑客"是检测工人范围内是否存在"窗口"属性.如果不存在,这可能意味着我们正在作为WebWorker执行.
其他选项是检测标准"窗口"上下文中不存在的属性.对于Chrome 14,此列表目前包括:
FileReaderSync
FileException
WorkerLocation
importScripts
openDatabaseSync
webkitRequestFileSystemSync
webkitResolveLocalFileSystemSyncURL
Run Code Online (Sandbox Code Playgroud)
检测WorkerLocation似乎是一个可行的候选人,但这仍然感觉有点hackish.有没有更好的办法?
编辑:这是我用来确定执行WebWorker中现在位于"窗口"中的属性的JSFiddle.
Ash*_*ain 14
该规范说:
在此规范的此版本中,DOM API(节点对象,文档对象等)不可用于工作者.
这表明检查缺席document是检查你是否在工人的好方法.或者您可以尝试检查是否存在WorkerGlobalScope?
虽然帖子有点旧,但添加了一些通用替代方案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..
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2177 次 |
| 最近记录: |