Phonegap 和 WebWorkers

Phonegap and WebWorkers

我正在尝试编写一个 PhoneGap/Cordova 应用程序。

我正在尝试在 Web Workers 中做一些较长的 运行 背景工作。但是我发现某些功能在 Web Workers 中不可用。

navigator.connection 在主脚本中可用,但在 Web Worker 中未定义,navigator.geolocation.

也是如此

我也想从 Web Worker 中访问 sql-lite 数据库。

关于如何在 PhoneGap/Cordova 中执行此类后台操作的任何想法?

任何人都可以提供任何帮助。

我想象你可以通过消息将它们传递给工作人员。像这里建议的东西:

javascript web workers - how do I pass arguments?

至于 sql-lite 数据库,您应该能够从工作脚本中初始化连接库,就像您在主脚本中一样。

我知道这个答案可能不值得赏金,但可能会让你朝着正确的方向开始

首先你要明白Worker是一个新的线程或进程,这不包括window和文档对象

Cordova 在 webview 和本机 API 之间创建了一个接口。如果您 运行 在 worker 中,您无权访问此 API 界面,因此您不能使用插件或 cordova 核心。

我尝试将 cordova.js 脚本导入到工作程序中:

loadScript('../cordova.js');

但是当它没有找到window对象时会抛出一个错误。最后,模拟对象:

self.window = this;
self.window.document = this;
loadScript('../cordova.js');

cordova 的脚本抛出 "ReferenceError: promp is not defined"。

另一方面,您需要了解,WebView 和本机代码之间的通信是异步的。例如,如果您发送一个 SQLite 查询,您的 JavaScript 代码将继续 运行s,当查询被解析时,API 向 WebView 发送一个事件并且您 运行这是你的回电。

我用worker来加密数据,因为这个过程太辛苦了,容易阻塞。但是如果你需要使用cordova插件,就不会出现这个问题了。

有解释to understand this

对于SQLite,我推荐你使用Cordova-SQLitePlugin

如果你需要自己的高级进程,你可以了解如何制作插件:https://cordova.apache.org/docs/en/4.0.0/guide_hybrid_plugins_index.md.html

在此期间,您可以使用 worker 并发送和接收数据,但不能使用资源引用。请注意,使用 api(如 SQLite),这将是异步的,您不需要打开另一个进程来执行它们。您可以将结果发送给工作人员并从那里开始工作。

由于您的 Web Worker 运行 在主应用程序线程之外,因此它们无法像您的主应用程序那样访问 JavaScript 功能。您的员工无权访问:

  • DOM
  • 文档对象
  • window对象
  • 父对象

如果您希望 UI 线程中的应用程序与 worker 通信,您需要通过消息传递对象。但是因为worker接受了string,所以可以使用JSON.parse()或者JSON.stringify()来成功发送对象。