JS - Передача функции в Web Worker

79
06 июля 2021, 00:30

Всем привет. Предположим есть файл - script1.js и другие файлы script1.js.., у которых есть некоторые экспортируемые функции со своим контекстом. Есть так же файл main.js, из которого создаётся воркер.

Если создать воркер и передать через postMessage функцию (хоть в свойстве объекта, хоть без), то будет ошибка о невозможности клонировать с указанием функции.

script1.js

export function foo() {
  return 0;
}

main.js

import { foo } from './script1';
let worker = new Worker('script1.js');
worker.postMessage(foo);
// Error cloned

Необходимо передать функцию с контекстом в Worker. Есть ли такая возможность и как?

Answer 1

Если нужно выполнить функцию в WebWorker без вынесения функции в отдельный js файл, и допустимо каждый раз запускать новый WebWorker, можно сделать это вот так:

function workerTask() { 
   return Math.random() * Math.random() 
} 
 
runInWebWorker(workerTask, console.log); 
 
function runInWebWorker(task, callback) { 
  task = `${task};(function(){this.postMessage(${task.name}())})();`; 
  var worker = new Worker(URL.createObjectURL(new Blob([task])));  
  worker.onmessage = e => worker.terminate() || callback(e.data); 
}

Answer 2

При передаче данные сериализуются, в следствии чего нельзя передать функцию. Функции, которые должны выполнится внутри воркера должны быть внутри воркера.

READ ALSO
Webpack. Ошибка после обновления

Webpack. Ошибка после обновления

Всем приветПосле обновления webpack с версии 2

106
Как использовать ymaps.geocode на react?

Как использовать ymaps.geocode на react?

Для достижения цели:

104
JQuery - найти элемент по тексту

JQuery - найти элемент по тексту

Нужно найти элемент на странице по значению текстаЕсть селектор contains, но он ищет по сути вхождение подстроки в строку

113