使用 web-worker 冻结对象
Freeze objects using web-worker
我有一组集合需要 freezed 使用 web-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
});
}
对象的可枚举性、可配置性或可写性属性是否仅限于特定范围?
当您调用 postMessage(obj)
时,您不会发送 obj
- 它是使用 structured clone algorithm.
克隆的
MDN 页面对冻结对象发生的情况相当明确:
Property descriptors, setters, and getters (as well as similar metadata-like features) are not duplicated. For example, if an object is marked read-only using a property descriptor, it will be read-write in the duplicate, since that's the default condition.
因此您不能在 WebWorker 中冻结对象并将其发送回主线程。
顺便说一下 - 您不必对传递给 WebWorker 的消息调用 JSON.stringify
。
我有一组集合需要 freezed 使用 web-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
});
}
对象的可枚举性、可配置性或可写性属性是否仅限于特定范围?
当您调用 postMessage(obj)
时,您不会发送 obj
- 它是使用 structured clone algorithm.
MDN 页面对冻结对象发生的情况相当明确:
Property descriptors, setters, and getters (as well as similar metadata-like features) are not duplicated. For example, if an object is marked read-only using a property descriptor, it will be read-write in the duplicate, since that's the default condition.
因此您不能在 WebWorker 中冻结对象并将其发送回主线程。
顺便说一下 - 您不必对传递给 WebWorker 的消息调用 JSON.stringify
。