reactjs - Web-worker 问题:未捕获的 DOMException:无法在“Worker”上执行“postMessage”
问题描述
我在 React 应用程序中有一个用 chartjs 制作的条形图。它运行良好,但数据解析可以由网络工作者处理,以加快页面加载速度。
我在 useEffect 函数中声明了我的网络工作者:
let data = React.useRef([]);
useEffect(() => {
const dataWorker: Worker = new Worker("./worker.ts");
dataWorker.postMessage({
msg: "formatData",
data: { series, theme, range },
});
dataWorker.onmessage = (e: MessageEvent) => {
if (e && e.data) {
data.current = e.data;
}
};
}, [range, series, theme]);
并且 webworker 在单独的文件 worker.ts 中定义:
self.onmessage = async (e) => {
if (e && e.data && e.data.msg === "formatData") {
const { sortedSeries, theme, range } = e.data;
// eslint-disable-next-line react-hooks/rules-of-hooks
const data = useFormatData(sortedSeries, theme, range);
self.postMessage(data);
}
};
function useFormatData(series, theme, range) {
return useMemo(() => {
// do stuff
};
}, [range, sortedSeries, theme]);
}
工作人员使页面崩溃并出现以下错误:
未捕获的 DOMException: 无法在 'Worker: function (number) { var b = number % 10, output = toInt((number...... } 无法克隆。
如何解决这个问题?
解决方案
我最近在将一个对象传递给包含我不知道的函数的 web worker 时看到了这个问题。
series
从您的错误的外观来看,在,theme
或range
传递给工作人员方面也可能是您的情况。
这个 SO Answer中解释了替代方案的一个很好的解释。总而言之,它提到只将可序列化的数据传递给工作者,然后在 webworker 端添加回函数(如果需要)。
推荐阅读
- r - 如何按多列合并行,获取多列中的最后一个非空值?
- postgresql - INSERT 具有比表达式更多的目标列 - 使用 SELECT 查询插入空表时
- apache-spark - 从列有条件地计数
- android - React 应用程序没有安装在我的本地计算机上
- google-admin-sdk - 如何在 Google Admin SDK API 中获取自定义属性?
- android - 使用 MaterialContainerTransform 重叠视图返回过渡
- javascript - 事件循环或 CPU,哪一个阻止了这个?
- google-sheets - 突出显示包含非英文字符的单元格
- python - Spark:如何转置具有不同大小行的动态列
- android - WindowInsetsController#hide(statusBars()) 导致内容跳转