【发布时间】:2020-04-06 07:52:51
【问题描述】:
我正在尝试将一些密集的数据处理卸载到 React 应用程序中的 WebWorker。如果我在 onmessage 处理程序中调用任何异步函数,使用 Promise 或 async/await,我会得到:
参考错误: _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default 没有定义
这是我的工人:
const DataSyncWorker = () => {
self.doSyncing = async () => {
return null;
};
self.onmessage = e => {
if (!e) return;
console.log(`worker received message in listener callback: ${e.data}`);
self.doSyncing();
self.postMessage(`SYNC_COMPLETE`);
};
};
export default DataSyncWorker;
以及用于创建 Worker 的设置文件:
export default class WebWorker {
constructor(worker) {
const code = worker.toString();
const blob = new Blob([`(${code})()`]);
return new Worker(URL.createObjectURL(blob));
}
}
并调用它:
import DataSyncWorker from './workers/DataSyncWorker';
import WebWorker from './workers/workerSetup';
const App = () => {
const dataSyncWorker = new WebWorker(DataSyncWorker);
dataSyncWorker.postMessage(`START_SYNC`);
dataSyncWorker.addEventListener(`message`, event => {
console.log(`index: message from worker: ${e.data}`);
});
}
如果我将 doSyncing 更改为非异步,则一切正常。这是一个简化的示例,我已经确认它仍然表现出相同的行为。但我无法使用 axios 或任何其他异步函数。我的理解是这应该是可能的,并且,鉴于错误,我想知道我的问题是否与 babel/webpack 有关。或者也许我做错了什么。任何帮助是极大的赞赏。谢谢。
【问题讨论】:
标签: reactjs webpack promise babeljs web-worker