我有一系列的集合,需要使用worker的冻住。下面的样本显示了一次收集冻结。
var worker = new Worker("worker.js");
worker.onmessage = function (e) { // WATCH MESSAGES FROM THE WORKER
var data = e.data;
// TEST: freezed collection property changes here in main scope. Weird!!!
};
worker.postMessage(JSON.stringify({
'collection' : someHugeJSON_object
}));
// In my worker.js
function deepFreeze(){
// my freezing logic
}
onmessage = function (e) {
var data = JSON.parse(e.data);
freezedJSON_object = deepFreeze(data.collection);
// TEST: collection property does not change in worker scope after freezing
// DONE FREEZING EVERYTHING... PHEW!!!
postMessage({
'collection' : freezedJSON_object
});
}对象的可枚举性、可配置性或可写性属性是否仅限于特定范围?
发布于 2016-02-11 13:15:08
当您调用postMessage(obj)时,您不会发送obj --这是使用结构化克隆算法的克隆。
MDN页面非常明确地说明了冻结对象的情况:
属性描述符、setters和getter(以及类似的元数据样功能)不是复制的。例如,如果一个对象使用属性描述符标记为只读,那么它将被读-写在副本中,因为这是默认条件。
因此,您不能冻结WebWorker中的对象并将其发送回主线程。
顺便说一句,您不必在传递给JSON.stringify的消息上调用WebWorker。
https://stackoverflow.com/questions/35338846
复制相似问题