我将一个空数组传递给一个工作人员,该工作人员应该填充该数组并返回它 - 我知道还有其他方法可以做到这一点,但我更感兴趣的是为什么它不起作用,而不是让它工作。
主要代码:
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(使用前将#替换为@)