Javascript worker.postMessage 缩小空数组

2024-03-27

我将一个空数组传递给一个工作人员,该工作人员应该填充该数组并返回它 - 我知道还有其他方法可以做到这一点,但我更感兴趣的是为什么它不起作用,而不是让它工作。

主要代码:

var arr = new Array(4)
console.log(arr.length)//outputs 4
var worker = new Worker("whatever.js")
worker.postMessage(arr)

工人代码

self.onmessage = function(msg){
    console.log(msg.data.length)//outputs 0
}

如果我传入一个填充数组,它就会起作用。如果我什至将数组的单个条目设置为一个值,它就可以工作。

为什么postMessage函数折叠非零长度但为空的数组,有办法避免这种情况吗? (除了手动赋值之外) 。

我使用的是 Windows 7 和 Chrome 51


数据通过以下方式复制给工作人员结构化克隆算法 https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm,因此您的工作线程无法获取您创建的确切数组,这将是线程不安全的操作,因为数组是引用类型。这是 MDN 文档不完整的情况,一般来说,除了少数例外,结构化克隆算法相当于JSON.parse(JSON.stringify(x))但这是一个例外JSON.parse(JSON.stringify(new Array(4))) yields [null, null, null, null]至少在 chrome 和 ff 中是这样。

这里奇怪的行为可能部分是因为创建带有空槽的数组确实没有任何意义,甚至没有任何索引,例如new Array(4).forEach(i => console.log('foo'));没有做任何事情。所以结构化克隆算法会生成一个空数组。

请注意,结构化克隆算法是notJavaScript 规范的一部分,它是HTML 5 规范 http://w3c.github.io/html/infrastructure.html#cloneable-objects据我所知并没有提供很多细节,所以我不完全确定它是如何工作的,但似乎专注于 fileData 和 Blob 之类的东西。请注意,克隆数组缓冲区is的一部分Ecmascript 规范 http://www.ecma-international.org/ecma-262/7.0/index.html#sec-clonearraybuffer。所有这些都是有道理的,工作人员在通信开销方面有巨大的性能损失(这就是提出共享内存结构的原因),这在很大程度上是由于相同的算法。因此,您想要在其中进行的计算必须足够密集,以超过启动和通信损失。因此,通信通道更关注那些低级(在 blob 情况下本质上是二进制)数据结构是有道理的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javascript worker.postMessage 缩小空数组 的相关文章

  • 从平面数组创建嵌套对象

    我目前有一个对象数组 我正在尝试将其重塑为嵌套对象ID作为对象键 并将其作为目标ID与parentid 如果不是 0 我尝试了几种方法 但我很挣扎 主要绊脚石for me是超过一两层深度的任何东西 理想情况下 我需要它是动态的 这样它就可以
  • 执行oauth时如何创建弹出窗口?

    我想通过使用弹出窗口来完成 Lifestream 和其他网站使用 oauth 身份验证所做的事情 他们打开一个弹出窗口 不知何故没有被弹出窗口拦截器阻止 并将他们的网站变灰 然后 在允许 oauth 访问时 它会说重定向回原始站点并终止弹出
  • 基于 json 文件动态显示选择、复选框、日期选择器等

    对我之前的问题的补充 我根据 json 文件动态显示输入字段 现在我想根据它们的组显示选择项 复选框和日期选择器 我如何解决这个问题 我需要将这些元素推入computeJSON 但写入例如选择options item selection不管
  • 如何将js文件从同一文件夹导入chrome扩展中的background.js

    我在导入与 background js 脚本库 位于同一库中的文件 score js 时遇到问题 我对 js 和 chrome 扩展都很陌生 我研究了 require js 并做了这个 背景 html h1 Tab Manager h1
  • Lodash 和 Underscore.js 之间的差异 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 为什么有人会更喜欢Lodash http lodash com or 下划线 js http underscorejs org 实用程序库优于其
  • JavaScript 中的凯撒密码

    我正在尝试编写一个程序来解决javascript中的以下问题 写在本段下面 我不知道为什么我的代码不起作用 有人可以帮助我吗 我是 JavaScript 新手 这是一个免费的代码训练营问题 现代常见的用法是 ROT13 密码 其中字母的值移
  • Javascript 3d 绘图实用程序? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有谁知道有什么好的 javascript 3d 绘图实用程序吗 我知道每个网站都推荐过画布 3d 图
  • 无法使用 jQuery 添加两个小数

    我试图将两个小数值相加 但返回的总和是纯整数 怎么了 我找不到它 欢迎任何帮助 jQuery delivery method ship select change function var cost jQuery this val jQue
  • 根据复选框显示/隐藏输入字段[重复]

    这个问题在这里已经有答案了 如果单击该复选框 它将显示一个输入字段 到目前为止它正在工作 但如果未选中该复选框 它应该隐藏它 我该怎么做 div class checkbox div
  • 为什么发送 fetch() 时我的响应数据未定义?

    我正在尝试在客户端使用 fetch 将数据发布到我的 NodeJS 服务器或从我的 NodeJS 服务器发布数据 服务器很好地收到了 post 请求 我能够记录 req 变量 但是当我 res send any data 时 客户端无法检测
  • 如何使用 javascript 禁用组合键?

    I would like to disable view source shortcut key for IE using JavaScript To disable Ctrl C I am using the following func
  • 通过API更新Twitter背景

    我在通过 Twitter 的 API 更新背景时遇到了一些问题 target url http www google com logos 11th birthday gif ch curl init curl setopt ch CURLO
  • Cypress.io 如何处理异步代码

    我正在将旧的水豚测试转移到 cypress io 因为我们的应用程序正在采用 SPA 方式 在我们的案例中 我们有超过 2000 个测试 涵盖了很多功能 因此 测试功能的常见模式是让用户创建并发布报价 一开始我写了 cypress 浏览页面
  • jQuery 更改为隐藏字段后触发重力表单中的表单更新

    简而言之 是否有 JavaScript 函数或挂钩来触发重力形式的更新 以便执行条件逻辑 原问题 我正在使用重力形式 并且创建了一个 变化时 事件 gform 1 find gfield date dropdown month select
  • Kotlin JavaScript 到 TypeScript 定义文件

    我已经找到了ts2kt 库 https github com Kotlin ts2kt这将从任意位置创建 Kotlin 头文件 d ts文件 但是 我想朝相反的方向走 我想构建一个可以编译为 JavaScript 的 Kotlin 库 但我
  • Nodejs 解码 base64 并使用流将它们保存到文件中

    在我的node js应用程序中 我使用以下代码行解码base64编码的图像 const fileDataDecoded Buffer from base64EncodedfileData base64 到目前为止 我可以使用以下代码编写一个
  • 如何在画布中旋转图表同时保持数字垂直?

    我正在尝试围绕其中心旋转画布中的图表 同时保持字母直立 我正在尝试使用 ctx rotate 但它使用画布的左侧作为中心来旋转整个图表 以下链接提供了视觉效果 我希望它看起来像绿色 而不是红色 就像我的代码当前所做的那样 视觉解释 http
  • 如何始终将焦点保持在画布上?

    我一直在这个论坛寻找解决方案 但尚未找到 无论我在页面上的哪个位置单击 我都需要始终将焦点放在画布元素上 我有几个按钮 在每个 onclick 事件中我写 document getElementById canvas focus 这确实有效
  • 在哪里放置资源特定逻辑

    您能帮我考虑在 AngularJS 中将资源 服务 特定的业务逻辑放置在哪里吗 我觉得在我的资源上创建一些类似模型的抽象应该很棒 但我不确定如何做 API调用 gt GET customers 1 lt first name John la
  • 如何循环遍历颜色数组以更改按键背景(按下/向下)

    互联网 如果这与其他人没有什么关系 请原谅我 但我会将其留在这里 以防这是一个有效的问题 我正在尝试创建一个文本区域字段 其中用户每次按下键 a z 都会触发背景颜色更改 在数组中列出 我一直在用 JQuery 做这件事 我想我已经很接近了

随机推荐

  • 计算 Google Sheets 脚本中的粗体单元格数量

    所以 说实话 我并不是一个编码员 但我已经设法通过计算单元格背景颜色来摸索 但努力让它适用于计算字体为粗体的单元格 我在下面详细介绍了我的函数 其中仅计算了 6 个具有粗体字体样式的单元格 但有 13 个具有粗体字体样式的单元格 funct
  • 相对时间序列

    我正在寻找一种标准化的方法来按相对时间排列数据 应用程序包括会计数据 例如 FY1 FY2 等 和经济数据 例如使用 1 年 2 年 3 年等的利率期限结构 我希望能够比较当前的一组时间序列数据和代表类似情况或历史规范的几个历史时间序列集
  • 立即处理至 App Store 后下架

    我的应用程序之前已下架 更新获得批准后 我在 10 分钟内收到了 3 封有关状态的电子邮件 1 处理至App Store 2 准备出售 3 停止销售 在 准备销售 状态之后 状态立即更改为 已从销售中删除 我联系了苹果公司 她说一旦应用程序
  • JavaScript XMLHttpRequest“网络错误”

    一般来说 我在 javascript 和 Web 开发方面缺乏经验 我正在从事的项目是一般公司培训计划的一部分 我们被指示使用 Google Chrome 作为主要测试浏览器 本质上 我正在编写一个将在公司内部网外部的客户端上运行的应用程序
  • 使用 Spark Web 框架时如何使用原生 Servlet Filter?

    我正在玩Spark http sparkjava com Java Web 框架 而不是 Apache Spark 我发现定义路由和过滤器非常好且容易 但是我希望将本机 servlet 过滤器应用于我的路由 但似乎找不到方法来做到这一点 更
  • 警告:preg_replace():未知修饰符“g”

    我遇到这个正则表达式错误 strTmp preg replace lt CharacterStyleRange gt n gim strTmp Error Warning preg replace 未知修饰符 g in Why g是隐含的p
  • 用于面部识别和标记的 Delphi 组件

    是否有任何好的组件 免费或商业 可用于 Delphi 我使用 Delphi 2009 使我能够轻松实现面部检测和标记照片 即图形 图像 中的面部 我需要做一些类似于 Google Picasa 网络相册可以做的事情 但是是在我的应用程序中进
  • 如何用Java实现子集和问题

    有谁知道如何通过这个伪代码在Java中实现子集和问题 w an array of positive integers sorted in non decreasing order W the target sum value include
  • 自动 AWS DynamoDB 到 S3 导出失败,并显示“role/DataPipelineDefaultRole 无效”

    严格按照以下说明进行操作这一页 http docs aws amazon com amazondynamodb latest developerguide DataPipelineExportImport Exporting html我正在
  • Angular:更改输入事件的值

    我有文本区域 我尝试将值的宽度限制为 10 个符号 我正在尝试削减价值input事件
  • 如何在我的 Webpack sass-loader 配置中指定包含 SCSS 的资源根?

    假设我有类似的东西 test scss exclude node modules loaders style loader css loader sass loader 在我的 webpack 配置中 我有一个app 包含我所有 SCSS
  • 选择 Qt 写入文本文件的自定义行结尾

    在 Qt 中写入文本文件时 使用 QFile 和 QTextStream 任何 n or endl自动转换为正确的平台特定行结尾 例如 r n对于 Windows 我想让用户选择使用哪个文件结尾 有没有办法在不使用二进制文件模式的情况下设置
  • 从 Byte[] 显示图像的最简单方法是什么?

    我有一个包含黑白图像的结构 public class Img public int height public int width public byte matrix 矩阵中包含的值为0或255 使用 C WPF 在组件中显示此图像的最佳
  • 并行位置

    并行性新手 正在学习使用 C 进行 HPX 的入门知识 我正在查看将打印的特定 hello word 示例hello world在每个位置的每个操作系统线程上 一些输出如下所示 hello world from OS thread 1 on
  • 列出子项 API 未提供驱动器/文件夹的所有子项

    我在获取用户 OneDrive 的文件 文件夹时遇到以下问题 击中时 https graph microsoft com v1 0 users https graph microsoft com v1 0 users 用户 ID 驱动器 我
  • GPU训练时Tensorflow 2.5退出代码-1073740791

    在 GPU 上训练 Tensorflow 模型时 调用 model fit 退出并带有代码 1073740791 0xC0000409 立即地 Epoch 1 500 2021 10 16 20 13 42 154951 I tensorf
  • 为 Visual Studio 2010 设置 OpenCV-2.3

    我正在尝试将 opencv 2 3 与 Visual Studio 2010 Express 一起使用 我的代码来自示例 include stdafx h include
  • 将 UTF-16 转换为 UTF-8

    我目前使用 VC 2008 MFC 由于 PostgreSQL 不支持 UTF 16 Windows 使用的 Unicode 编码 我需要在存储之前将字符串从 UTF 16 转换为 UTF 8 这是我的代码片段 demo cpp Defin
  • android 按下并按住按钮时重复动作

    我想在按住按钮时实现重复操作 示例 当用户单击按钮并按住它时 它应该以固定的时间间隔一次又一次地调用类似的方法 直到用户将手指从按钮上移开 有多种方法可以实现这一点 但一个非常简单的方法是发布Runnable on a Handler有一定
  • Javascript worker.postMessage 缩小空数组

    我将一个空数组传递给一个工作人员 该工作人员应该填充该数组并返回它 我知道还有其他方法可以做到这一点 但我更感兴趣的是为什么它不起作用 而不是让它工作 主要代码 var arr new Array 4 console log arr len