我有一个相当大的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
来执行此操作,但到目前为止没有任何效果。有人可以帮忙吗?