【问题标题】:Web Workers Comlink - Failed to transfer Higher order functionWeb Workers Comlink - 无法传输高阶函数
【发布时间】: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


猜你喜欢
  • 1970-01-01
  • 2012-07-07
  • 2020-03-22
  • 2019-09-22
  • 1970-01-01
  • 2011-06-22
  • 2017-07-05
  • 2016-05-07
相关资源
最近更新 更多