Web Worker 中的传感器读数
Posted
技术标签:
【中文标题】Web Worker 中的传感器读数【英文标题】:Sensor reading in web worker 【发布时间】:2014-02-05 15:10:41 【问题描述】:似乎我们无法在网络工作者中获取传感器数据。我想知道它背后的原因。用例是我正在考虑在工作线程中获取地理位置数据,并且只将处理后的版本发送到主线程。
对于 GPS,post 表示工作线程不支持它(没有给出原因)。我仔细检查了一下,网络工作者不支持 navigator.geolocation 。对于加速器和陀螺仪,我们有 DeviceOrientationEvent 和 DeviceMotionEvent。但是我们需要通过window对象来使用它们,这个对象是工作线程不可用的。同样的情况也适用于环境光事件。
所以我的问题是:
-
为什么 web worker 不支持 navigator.geolocation?我看不出有任何理由在工作线程中阻止它。我认为应该没有线程安全或安全问题。
navigator.geolocation 是否属于 navigator?这看起来像一个愚蠢的问题。但是我不能很快在网上找到一个很好的解释......网络工作者可以访问导航器对象。我很困惑为什么不支持navigation.geolocation。
为什么我们没有来自加速器和陀螺仪的原始传感器读数?我知道抽象事件很有用。但是在某些情况下,我们希望使用原始数据进行处理。我发现 PhoneGap 提供了访问原始传感器数据的方法,例如,通过navigator.accelerometer。但我的理解是这样的API不属于标准化的html规范。
决定工作线程中是否应支持通用传感器读取的相关设计决策是什么?根据W3C Device APIs Working Group,HTML 中的一般传感器读取支持目前被搁置。看到当前的传感器支持(gps、加速器、陀螺仪),我想我们会得到抽象的 DOM 事件。并且很可能通过导航器对象读取原始传感器数据。
【问题讨论】:
【参考方案1】:好的。在阅读了一些 Chromium 代码之后,我现在有了自己问题 2 的答案。其他 3 个问题我仍然没有答案...
回答问题2:navigator.geolocation是否属于navigator?
navigator.geolocation 只属于主线程中的navigator,不属于工作线程中的navigator。
主要原因是即使工作线程中的导航器看起来与主线程中的导航器完全相同,但这两个导航器在 C++ 端具有独立的实现。这就是工作线程不支持 navigator.geolocation 的原因。
相关代码在 Chromium 代码中的 Navigator.idl 和 WorkerNavigator.idl 中。您可以看到它们是 .idl 文件中的两个独立接口。他们在绑定的 C++ 端有独立的实现。 Navigator 是DOMWindow 的一个属性,而WorkerNavigator 是WorkerGlobalScope 的一个属性。
但是,在 javascript 方面,它们具有相同的名称:navigator。嗯,我了解这两个导航器在两个不同的范围内,所以不存在名称冲突。但是当我在 JavaScript 中使用 API 时,如果主线程和工作线程具有相同的名称,我希望它们的行为相似。歧义就是这样发生的。
【讨论】:
以上是关于Web Worker 中的传感器读数的主要内容,如果未能解决你的问题,请参考以下文章
使用 Python Matplotlib 在 3D 轴上为振动传感器读数创建动画散点图