使用web-worker冻结对象

时间:2016-02-11 12:02:35

标签: javascript web-worker

我有一组使用web-worker需要freezed的集合。以下示例显示单一收集冻结。

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
    });
}

对象的可枚举性,可配置性或可写性属性是否仅限于特定范围?

1 个答案:

答案 0 :(得分:3)

当您致电postMessage(obj)时,您不会使用structured clone algorithm发送obj - 克隆

MDN页面对冻结对象的结果非常明确:

  

属性描述符,setter和getters(以及类似的类似元数据的功能不重复。例如,如果使用属性描述符将对象标记为只读,则它将以重复方式进行读写,因为它是默认条件。

因此,您无法在WebWorker中冻结对象并将其发送回主线程。

顺便说一下 - 您不必在传递给WebWorker的邮件上调用JSON.stringify