У меня довольно большое веб-приложение, которое сейчас использует несколько веб-работников.В результате теперь есть довольно много дублирующегося кода, который я хотел бы уменьшить, но у меня есть некоторые проблемы, делающие мой код более универсальным.
В качестве исходного примера приведу рабочий пример класса, которыйвозвращает new Worker
, который будет выполнять следующую функцию на входе и возвращать результат: data => data.map(document => document._id)
export default class WebWorker {
constructor () {
const worker = () => {
self.addEventListener('message', function (e) {
if (!e.data) return
const work = data => data.map(document => document._id)
postMessage(work(e.data))
})
}
const code = worker.toString()
const blob = new Blob(['(' + code + ')()'])
return new Worker(URL.createObjectURL(blob))
}
}
Этот код работает, как и ожидалось.Но для того, чтобы это работало, я должен явно написать функцию work
внутри Event Listener.Чтобы сделать этот код многократно используемым, мне нужно передать work
извне.
Реализация, которая у меня в голове, будет выглядеть примерно так:
export default class WebWorker {
constructor (work) {
const worker = work => () => {
self.addEventListener('message', function (e) {
if (!e.data) return
postMessage(work(e.data))
})
}
const code = worker(work).toString()
const blob = new Blob(['(' + code + ')()'])
return new Worker(URL.createObjectURL(blob))
}
}
Однако напо крайней мере при запуске в браузере значение work
не передается обработчику self.addEventListener
.
Я пытался сделать это, используя .bind
, но пока безрезультатно.Кто-нибудь может помочь?