Как передать аргумент функции веб-работнику с помощью addEventListener - PullRequest
0 голосов
/ 22 ноября 2018

У меня довольно большое веб-приложение, которое сейчас использует несколько веб-работников.В результате теперь есть довольно много дублирующегося кода, который я хотел бы уменьшить, но у меня есть некоторые проблемы, делающие мой код более универсальным.

В качестве исходного примера приведу рабочий пример класса, которыйвозвращает 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, но пока безрезультатно.Кто-нибудь может помочь?

...