Skip to content

JS MessageChannel 实现深拷贝

Published: at 05:21 PMSuggest Changes

MessageChannel

MessageChannelHTML5 中新增的一个 API,它可以用来创建一个 MessagePort 的通道,可以用来实现 Web Worker 之间的通信。

创建 MessageChannel

const { port1, port2 } = new MessageChannel();

MessageChannel 的使用

port1.onmessage = (e) => {
  console.log(e.data);
};
port2.postMessage("hello");

MessageChannel 实现深拷贝

因为 postMessage 方法是异步的,所以要用 Promise 来实现数据的返回

function cloneByMessageChannel(params) {
  return new Promise((resolve) => {
    const { port1, port2 } = new MessageChannel();
    port2.onmessage = (ev) => resolve(ev.data);
    port1.postMessage(params);
  });
}

测试

const obj = {
  a: 1,
  b: {
    c: 1,
  },
};
cloneByMessageChannel(obj).then((res) => {
  console.log(res); // {a: 1, b: {c: 1}}
  obj.a = 2;
  console.log(obj); // {a: 2, b: {c: 1}}
  console.log(res); // {a: 1, b: {c: 1}}
  obj.b.c = 2;
  console.log(obj); // {a: 2, b: {c: 2}}
  console.log(res); // {a: 1, b: {c: 1}}
});

后记


Previous Post
JS 解决 'Failed to execute 'put' on 'IDBObjectStore'...' 问题
Next Post
JavaScript structuredClone 深拷贝实现详解