# 多线程 Worker

通常情况下,所有的 ECMAScript 程序都是运行在 JSKit App 的主线程。worker 模块参考 Web Workers (opens new window) 实现了Web Worker API的一个子集,提供了 ECMAScript 多线程执行能力。

提示

JSKit 的 WorkerWeb Workers 实现稍有不同。请注意区别。

警告

不要在 worker 线程里执行 UI 相关的操作,可能会导致崩溃。

Worker 接口一般涉及到两个 ECMAScript 脚本:一个运行在主线程;另一个运行在工作线程。

# 主线程引入

Worker 模块需要显示的导入:

import Worker from 'worker';

# 构造 Worker 对象

constructor(moduleId)

  • moduleId 模块ID,运行在 worker 线程的 ES 模块名。
  • Returns: 返回 Worker 对象
const worker = new Worker('./worker')

# 发送消息到 worker 线程

postMessage(req)

  • req 发送到 worker 线程的消息数据。

注意

当下,在 JSKit 内部,是通过 JSON 序列化 data 对象在 worker 与主线程之间传输的。

# 接收来自 worker 线程消息

通过重写 worker 的 onMessage(resp) 方法接收来自 worker 线程的消息。

worker.onMessage(resp)={
    //handle resp
}

# worker 线程处理

模块 ./worker.js 中可通过一个全局变量 self 访问到 worker 实例。与主线程的消息接收类似,可通过 onMessage 来接收来自主线程的数据:

self.onMessage(req)={
    //handle req
}

# worker 线程向主线程发送消息

self.postMessage(resp)

  • resp 发送到主线程的消息数据。

# 结束 worker

在主线程的 worker 对象和 Worker 线程里的 self 对象上,都有一个 terminate 函数,Worker线程可在需要时通过 worker.terminate() 被动地,或通过 self.terminate() 主动地结束 Worker 。

警告

不要在 terminate 之后继续执行任何 js 代码。

# Demo

在我们的官方示例库中提供了一个 worker 相关接口的简单用例: worker-demo0。可在 JSKit App 首页的右上角菜单订阅仓库中查找并安装体验。