【发布时间】:2022-06-14 21:18:52
【问题描述】:
我一直致力于我们的大型项目,尝试使用 Comlink - https://www.npmjs.com/package/comlink 集成 Web Workers。
到目前为止,我已经能够通过comlink 制作我的Web Worker 并传输一些数据,例如对象和函数(函数在proxy 的帮助下)。但是,某些函数无法被代理,因为它们可能包含一个参数,该参数是一个返回函数的函数(高阶函数)。发生这种情况时,我收到一个错误:
comlink.mjs:238 Uncaught (in promise) DOMException: Failed to execute 'postMessage' on 'MessagePort': function (url, _ref) { var qs = _ref.qs, optionsWithoutQs = _objectWithoutProperties(_ref, ["qs"]);...<omitted>... } could not be cloned. 关注代码
function queryParser(otherFn) {
return (url, { qs, ...optionsWithoutQs }) => {
const qsPart = queryString.stringify(qs) || '';
const urlWithQS = `${url}${qsPart ? '?' : ''}${qsPart}`;
return requestFunction(urlWithQS, optionsWithoutQs);
};
}
function nonTransferableFn() {
return {
...
myOtherFunction: queryParser()
}
}
const webWorkerProxy = wrap(new Worker(new URL('./web-worker.js', import.meta.url)));
const webWorkerInstance = await new webWorkerProxy();
webWorkerInstance.initialize(nonTransferableFn: proxy(nonTransferableFn));
我相信这是因为这里的高阶函数。如何通过comlink解决这个问题?有什么解决办法吗?
由于项目庞大,现阶段无法更改函数的语法,而且我们在太多地方使用这种模式。
非常感谢任何帮助!
【问题讨论】:
-
我似乎找不到任何生成器。示例中的生成器在哪里?
-
对不起,我的错,我以为这些被称为生成器。那么也许返回函数的函数是这里更合适的名称?
-
生成器是一个完全不同的概念,这个只是返回函数的函数的名称
标签: javascript proxy generator web-worker comlink