MessageChannel
MessageChannel 是 HTML5 中新增的一个 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}}
});
后记
上一篇
JS 解决 'Failed to execute 'put' on 'IDBObjectStore'...' 问题
本文介绍如何解决 JavaScript 中 IndexedDB 的 'Failed to execute 'put' on 'IDBObjectStore': An object could not be cloned' 错误。该错误通常是因为存储对象包含不可序列化的数据类型(例如 Promise 对象)引起的。文章提供了几种解决方案,包括使用 `realistic-structured-clone` 库进行深拷贝,以及其他替代方案的比较。
下一篇
优秀的浏览器 IndexedDB 库 - localforage
localforage 是一个优秀的浏览器本地存储库,它简化了 IndexedDB 的使用,提供统一的 API,兼容多种浏览器,方便开发者在不同浏览器环境中进行本地数据存储操作。