Javascript worker.postMessage 缩小空数组

标签 javascript arrays google-chrome web-worker

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

主要代码:

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

worker 代码

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

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

为什么 postMessage 函数会折叠非零长度但为空的数组,有没有办法避免这种情况? (除了手动分配一个值) .

我使用的是 Windows 7 和 Chrome 51

最佳答案

数据通过 structured cloning algorithm 复制给工作人员,所以你的工作人员没有得到你创建的确切数组,这将是一个线程不安全的操作,因为数组是引用类型。这是 MDN 文档不完整的情况,一般来说,除了少数异常(exception),结构化克隆算法等同于 JSON.parse(JSON.stringify(x)) 但这是一个异常(exception),因为 JSON.parse(JSON.stringify(new Array(4))) 至少在 chrome 和 ff 中产生 [null, null, null, null]

这里的奇怪行为可能部分是因为创建带有空槽的数组真的没有任何意义,甚至没有任何指标,例如new Array(4).forEach(i => console.log('foo')); 不执行任何操作。因此结构化克隆算法生成一个空数组。

请注意,结构化克隆算法不是 JavaScript 规范的一部分,而是HTML 5 spec 的一部分。据我所知并没有提供很多细节,所以我不完全确定它是如何工作的,但似乎专注于 fileData 和 Blob 之类的东西。请注意,克隆数组缓冲区 Ecmascript spec 的一部分.所有这些都是有道理的,由于相同的算法,工作人员在通信开销方面有巨大的性能损失(这就是为什么提出共享内存结构的原因)。因此,您要在其中进行的计算必须足够密集,以抵消启动和通信方面的损失。因此,通信 channel 更关注那些低级(在 blob 情况下基本上是二进制的)数据结构是有道理的。

关于Javascript worker.postMessage 缩小空数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38770305/

相关文章:

c++ - 在 C 和 C++ 中通过 index[array] 访问数组

javascript - 使用javascript获取所有现有的html标签

css - SVG 转换 ="rotate(180)"在 Safari 11 中不起作用

javascript - normalizr 模式中的嵌套数组

javascript - 如何从 randomuser API 获取用户的用户详细信息?

javascript - JS This 和模板字面量实践

css - 无法加载资源:CDN 上的 net::ERR_CONNECTION_RESET

javascript - 无法在 php 中获取已发布的 FormData

来自mysql结果的php多维数组

php - Jquery Ajax PHP 二维复选框数组