与共享工作人员一起使用可转移对象
Use transferable objects with a shared worker
在共享工作线程中使用可转移对象时,我在主线程中接收null
代替event.data
。经过一番搜索,我找到了这篇文章,其中解释了ArrayBuffer
在通过MessageChannel
的MessagePort
时总是丢失。
共享工作者通信也使用端口和消息通道来完成。这是否意味着无法在SharedWorker
实例中使用可转移对象?或者有什么变通办法?
我需要将一个巨大的string
从SharedWorkerGlobalScope
传输回主线程。其思想是将其转换为ArrayBuffer
,如本例所示,然后传输缓冲区。这应该比发送字符串快得多。。。
发送数据:
var arrayBuffer = convertStringToArrayBuffer( string );
var data = {
message: "here is an array buffer",
arrayBuffer: arrayBuffer
};
port.postMessage(data, [data.arrayBuffer]);
接收数据:
worker.port.onmessage = function( event ) {
// data is null
var data = event.data;
}
只需使用postMessage
而不使用可转移项。字符串无论如何都是不可转移的(所以它总是被复制的)。
具有可转移性的目标是在将对象从发送方传递到接收方时具有最小的成本。这样的消息可以跨越进程边界,并且进行进程间通信是昂贵的。这就是MessagePort
尚不支持可传输内容的原因。顺便说一句,跨流程通信的困难也是Safari放弃对SharedWorkers支持的原因。
相关文章:
- 将代码转换为可重用对象
- 如何在我传递给视图的ViewModel集合中获得jQuery可选对象的值,以作为有序列表进行迭代
- 最新typescript编译器版本(0.9.5)中的可索引对象
- 在ko.applyBindings(..)中执行Knockout js订阅函数(用于可观察对象)
- 模仿`overflow-y:auto;overflow-x:visible `在jQuery UI可排序对象上
- Knockout.js用单个json对象绑定一个可观察对象
- Web Workers-JSON的可传输对象
- 代码在 Meteor 和 AngularJS 之间的可转移性如何
- 根据某些条件将 JS 绑定到可观察对象内的数组元素
- Jquery UI:如何指示可拖动对象成功拖放到可排序对象上
- Jquery 如何指定哪个可丢弃对象应与嵌套的可放置元素一起使用
- 使用可编辑对象进行分组
- 我怎样才能延迟可折叠对象的扩展,直到获取其内容
- 如何从挖空可观察对象中获取所选项目的文本
- 我正在尝试从可绘制对象中获取位图
- 从另一个可观察对象获取价值的最佳方法,而无需组合最新
- 如何在目标可排序对象接收后获取拖动项的类
- 可观察对象的角 2 条件链接
- 与共享工作人员一起使用可转移对象
- JavaScript Float32Array检查可转移对象是否被中性化