Javascript WebWorker - 异步/等待

2023-12-25

我正在尝试卸载阻塞我的用户界面的长时间运行的进程。

WebWorker 方法似乎是解决这种情况的最佳方法。

但是,我需要使用的库之一具有 async/await。

WebWorker 的 JS API 有限,并且似乎没有 async/await。

有没有办法在 WebWorker 内部使用 Promise?

Error

ReferenceError:未定义 __awaiter

Regards,

Daniel

Update:

添加 __awaiter 会导致 Promise 不被识别。

var __awaiter =
        (this && this.__awaiter) ||
        function(thisArg, _arguments, Promise, generator) {
            return new Promise(function(resolve, reject) {
                generator = generator.call(thisArg, _arguments);
                function cast(value) {
                    return value instanceof Promise && value.constructor === Promise
                        ? value
                        : new Promise(function(resolve) {
                                resolve(value);
                          });
                }
                function onfulfill(value) {
                    try {
                        step('next', value);
                    } catch (e) {
                        reject(e);
                    }
                }
                function onreject(value) {
                    try {
                        step('throw', value);
                    } catch (e) {
                        reject(e);
                    }
                }
                function step(verb, value) {
                    var result = generator[verb](value);
                    result.done
                        ? resolve(result.value)
                        : cast(result.value).then(onfulfill, onreject);
                }
                step('next', void 0);
            });
        }

以下是如何构建 Web Worker 的骨架代码。

/* eslint-disable */
export default function ModelWorker() {
  this.window = this

  onmessage = async (e) => {
    console.log(e);
  }
}

WorkerProxy.js

export default class WorkerProxy {
  constructor(worker) {
    const code = worker.toString()
    const src = code.substring(code.indexOf('{') + 1, code.lastIndexOf('}'))
    const blob = new Blob([src], { type: 'application/javascript' })
    return new Worker(URL.createObjectURL(blob))
  }
}

一些组件.js

import WorkerProxy from './WorkerProxy'
import ModelWorker from './ModelWorker'


if (!!window.Worker) {
  const worker = new WorkerProxy(ModelWorker)
  worker.addEventListener('message', e => console.log(e.data))
  worker.postMessage({ message:message })
  // Load labels, etc.
}

async/await是一部分ECMAScript语言,并且这些在所有全局范围内都可用,无论是 Window、Web Worker、Service Worker、Audio Worklet、Paint Worklet 等。

这些范围可能没有一些 Web API,例如 DOM API、MediaDevices API、Geolocation API 等。但是,只要浏览器支持此 ECMAScript 功能,那么所有范围都将支持。

所以我不知道你的问题是什么,但绝对可以在 Worker 中使用 Promises 和 async/await 。

const worker = new Worker(
  URL.createObjectURL(
    new Blob([worker_script.textContent])
  )
);
worker.onmessage = ({data}) => console.log(data);
<script type="worker-script" id="worker_script">
  (async function() {
    postMessage(['starting', performance.now()]);
    await wait(2000);
    postMessage(['ended', performance.now()]);
  })();
  function wait(time) {
    return new Promise((res)=>setTimeout(res, time));
  }
</script>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javascript WebWorker - 异步/等待 的相关文章

随机推荐

  • 按钮内的复选框?

    有什么方法可以在按钮内添加复选框吗 目前我有这个解决方案 div div
  • psycopg2:光标已关闭

    我在用psycopg2 2 6 1 我有很多需要按顺序执行的查询 conn psycopg2 connect database redshift database user redshift user password os environ
  • 将 .NET Core Identity 与 API 结合使用

    我创建了一个 API 并从同一 API 设置了 JWT 身份验证 我选择不使用 IdentityServer4 我通过这样做services AddAuthentication 然后我在控制器中创建了令牌并且它起作用了 不过我现在想添加注册
  • 无法对 DataGrid 中的日期列进行排序

    我添加了一个日期列DatePicker to my DataGrid并且无法通过单击来对该列进行排序Header 我想这与我的日期格式有关 但我找不到解决方案 我的代码是
  • 在传递到 Web 服务之前将 jqGrid rowNum 从 ALL 更改为 -1 的最佳方法

    我正在寻找允许用户选择在 jqGrid 中显示所有记录的最佳方法 我知道为 rows 参数传递的 1 值表示 ALL 但我希望单词 ALL 而不是 1 出现在 rowList 选择元素中 即 行列表 15 50 100 全部 我正在将网格请
  • 改造android的Proguard规则

    我正在对 Android 应用程序实施混淆器规则 当我编译该 apk 时 改造类仍然没有改变 请看一下我的 proguard 文件 并请指导我哪里缺少规则 keep public class org slf4j keep public cl
  • 如何在Tab布局中设置Tab宽度?

    我正在尝试创建一个tab layout其中有两个tabs 当我在小型手机上运行该应用程序时tab layout看起来不错 但是当我运行相同的应用程序时Tablet它显示如下 在平板电脑上看起来像这样 我希望每个选项卡占据整个空间 两端没有任
  • Javascript 验证 HTML 表单中的 X 个字段

    我有一个表单 其中包含大约 10 个文本条目 用户 地址 电子邮件等 大约有 50 多个条目是数量条目 用户选择该条目的 2 倍 该条目的 5 倍 现在 我从其他人那里继承了这张表格 现在我有责任在客户要求时保持最新状态 我不想全部重写 但
  • 如何将 core-js Map 导入 angular-cli webpack 生成的应用程序

    1 0 0 beta 11 webpack 现在使用 core js 进行 polyfill 我正在尝试导入地图以在我的应用程序中使用 import Map from core js es6 map import Map from core
  • 为什么合并 PDF 会使文件大小变大?

    我正在尝试将各种 PDF 拆分在一起 它们的文字不多 偶尔会有图像 举例来说 我有两个 PDF 1 4Mb 和 740kb 当我将它们合并时 它们会膨胀到 6Mb 我尝试过脚本化组合和手动附加 结果相同 所以我猜测这是一个根本问题 对为什么
  • 上下文在 Code First 模式下使用,其中的代码是从 EDMX 文件生成的,用于 Database First 或 Model First 开发

    我正在尝试将最初使用 EF4 开发的项目迁移到 EF6 以利用 EF6 事务管理 我面临的问题是该项目是使用数据库优先方法创建的 所以当我使用类似的代码时context Database UseTransaction 我遇到以下错误 The
  • Sublime text:如何将键绑定添加到 hex_viewer 包命令

    我已经在 sublime text 3 上安装了 Hex Viewer 包 为了切换它 我使用 ctrl shift p 打开命令面板 然后我搜索 hex 并选择包的命令来切换十六进制视图 我想知道如何将键绑定到特定的包命令 我知道键绑定配
  • IISExpress 用户界面 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我刚刚下载并安装了 IIS Express 从命令行运行它一切正常 但是我如何配置它的选项 是否有一个
  • Python os.path.relpath 行为

    我有一个目录bar在目录内foo 带文件foo file txt在目录中foo和文件bar file txt在目录中bar i e computer ls foo computer ls foo bar foo file txt compu
  • 云优化与云原生

    在尝试更好地理解云原生应用程序时 我遇到了云优化这个术语 有人可以帮助我了解云优化与云原生之间的区别吗 云优化涉及应用程序如何迁移到云或在那里开发和托管 如何通过优化过程来提供更多价值 降低成本 标准化事物 最初 一旦迁移或托管在云中 由于
  • 命令 APDU 在结果中返回 6985(不满足使用条件)

    我正在研究用 Java 读取智能卡 当我执行下面的代码时 卡返回 6985 不满足使用条件 TerminalFactory factory TerminalFactory getDefault List
  • 快速从网络抓取函数返回一个字符串

    好的 我正在抓取网页的一些基本数据 我想将我的代码重构为另一个类 并从我检索到的内容返回一个字符串 但这对于异步函数来说很困难 而且我对 swift 很陌生 我现在意识到这个函数无法返回字符串 但我不太清楚如何配置完成处理程序以及如何使用完
  • 添加新颜色以及自定义主题颜色 angular2 材质

    如何在 Angular 2 材质中添加新颜色 它在 ng2 material 文档中指定 color primary accent warn 被接受 我想添加类似 progressbarcolor 的内容 而不是在我的 angular2 材
  • 包括未找到模块 RubyMotion

    RubyMotion 中允许 mixin 吗 我有一个包含两个文件的目录 一个是类 另一个是模块 当我在类中包含模块 mixin 时 出现未找到错误 RM 中自动需要应用程序下的所有内容 对吗 谢谢你的帮助 找到了 http dylanma
  • Javascript WebWorker - 异步/等待

    我正在尝试卸载阻塞我的用户界面的长时间运行的进程 WebWorker 方法似乎是解决这种情况的最佳方法 但是 我需要使用的库之一具有 async await WebWorker 的 JS API 有限 并且似乎没有 async await