deno.com

Web Worker

Workers 是在主线程之外运行 JavaScript 的唯一方式。这对于各种程序都很有用,特别是那些需要大量计算且不希望阻塞线程的程序。

首先我们将定义一个 Web Worker,它可以接收来自主线程的消息并进行处理。
./worker.ts
self.onmessage = async (e) => {
  const { filename } = e.data;
  const text = await Deno.readTextFile(filename);
  console.log(text);
  self.close();
};
目前,Deno 只支持模块类型的 Worker。要实例化一个 Worker,我们可以使用与网络上类似的语法。
./main.ts
const worker = new Worker(
  new URL("./worker.ts", import.meta.url).href,
  {
    type: "module",
  },
);
我们可以使用 `postMessage` 方法向 Worker 发送消息。
./main.ts
worker.postMessage({ filename: "./log.txt" });
默认情况下,Worker 会继承其实例化线程的权限。我们可以通过使用 deno.permissions 选项为 Worker 赋予特定权限。
./main.ts
const worker2 = new Worker(
  new URL("./worker.ts", import.meta.url).href,
  {
    type: "module",
    deno: {
      permissions: {
        read: [
          new URL("./file_1.txt", import.meta.url),
          new URL("./file_2.txt", import.meta.url),
        ],
      },
    },
  },
);
由于我们使用特定权限实例化了这个 Worker,这将导致 Worker 尝试读取它无权访问的文件,从而抛出权限错误。
./main.ts
worker2.postMessage({ filename: "./log.txt" });

您找到所需内容了吗?

隐私政策