Estoy aprendiendo sobre Web Worker y hoy necesitaba hacer que una función externa funcione dentro de Web Worker como esta:
principal.js:
function doSomething(parameter){ //Doing something } if (window.Worker) { const myWorker = new Worker("worker.js"); myWorker.postMessage("Hello World"); } else { console.log('Your browser doesn\'t support web workers.'); }trabajador.js:
onmessage = function(e) { doSomething(e.data) }¿Tiene una manera de hacer este trabajo?
Todo lo que envíe a un trabajador web tiene que ser serializable . Como una función no lo es, no puede usar el patrón de devolución de llamada como probablemente le gustaría hacer.
La única solución es enviar un mensaje al hilo principal tal como lo hizo con postMessage , y el hilo principal tiene que reconocer ese mensaje con el detector de eventos de message y ejecutar la función doSomething por sí mismo.
Es un poco complicado, pero dependiendo de su caso de uso, puede hacer algo como lo siguiente:
// main.js const doSomething = (param) => { return param + '!!!' } const worker = new Worker("worker.js") worker.postMessage({ fn: doSomething.toString(), param: "Hello World", }) worker.onmessage = (e) => { console.log(e.data) // logs "Hello World!!!" } // worker.js: self.onmessage = (e) => { const { fn, param } = e.data const result = eval(`(${fn})`)(param) self.postMessage(result) } Tenga en cuenta que generalmente es mejor evitar eval , pero puede ser seguro aquí siempre que doSomething sea un código confiable.
Tenga en cuenta también que esto fallará si doSomething se basa en dependencias externas a sí mismo; todas esas dependencias deberán ser serializables y pasarse explícitamente como parámetros, a través del mismo mecanismo postMessage .