如何使用addEventListener将函数参数传递给Web Worker

时间:2018-11-22 16:53:06

标签: javascript scope refactoring web-worker

我有一个相当大的Web应用程序,该应用程序现在使用多个Web Worker。结果,现在我想减少很多重复的代码,但是我在使代码更通用时遇到了一些问题。

作为开始的示例,这里是一个返回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函数。为了使此代码可重复使用,我需要从外部传递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来执行此操作,但到目前为止没有任何效果。有人可以帮忙吗?

0 个答案:

没有答案