Worker Thread 的 parentPort 侦听器中回调函数内的未定义对象属性
Undefined object properties inside callback function in Worker Thread's parentPort listener
我有一个这样的工作对象:
const WorkerObject = {
mapProp: new Map(),
funA() {
// some task
},
funB() {
// some task
},
workerListener() {
parentPort.on('message', async (message) => {
console.log(this.mapProp) // returning Map(0) {}
})
}
}
当我在 workListener()
函数内的 parentPort()
侦听器回调中调用 mapProp
属性 时,它引用了我在对象顶部分配的 Map .这正是我所期望的。
但我需要降低认知复杂度,所以我将回调函数移至 WorkerObject
中的另一个定义函数。
const WorkerObject = {
mapProp: new Map(),
funA() {
// some task
},
funB() {
// some task
},
async doBulkIndex(message) {
console.log(this.mapProp) // returning undefined
},
workerListener() {
parentPort.on('message', this.doBulkIndex)
}
}
但不知何故,现在 Map 总是返回未定义的。基本上,我试图在 doBulkIndex()
中访问的所有属性都是未定义的。为什么会这样?以及如何使我的第二种方法与前一种方法具有相同的行为?
你调用的回调上下文不一样,我觉得你应该给它绑定"this",
workerListener() { parentPort.on('message', this.doBulkIndex.bind(this))}
在第一个中,this 关键字指的是 WorkerObject 但在第二个中,this 指的是“doBulkIndex”上下文。您可以搜索上下文并绑定。
参见:bind keyword
所以我们使用绑定手动将上下文更改为主对象。
我有一个这样的工作对象:
const WorkerObject = {
mapProp: new Map(),
funA() {
// some task
},
funB() {
// some task
},
workerListener() {
parentPort.on('message', async (message) => {
console.log(this.mapProp) // returning Map(0) {}
})
}
}
当我在 workListener()
函数内的 parentPort()
侦听器回调中调用 mapProp
属性 时,它引用了我在对象顶部分配的 Map .这正是我所期望的。
但我需要降低认知复杂度,所以我将回调函数移至 WorkerObject
中的另一个定义函数。
const WorkerObject = {
mapProp: new Map(),
funA() {
// some task
},
funB() {
// some task
},
async doBulkIndex(message) {
console.log(this.mapProp) // returning undefined
},
workerListener() {
parentPort.on('message', this.doBulkIndex)
}
}
但不知何故,现在 Map 总是返回未定义的。基本上,我试图在 doBulkIndex()
中访问的所有属性都是未定义的。为什么会这样?以及如何使我的第二种方法与前一种方法具有相同的行为?
你调用的回调上下文不一样,我觉得你应该给它绑定"this",
workerListener() { parentPort.on('message', this.doBulkIndex.bind(this))}
在第一个中,this 关键字指的是 WorkerObject 但在第二个中,this 指的是“doBulkIndex”上下文。您可以搜索上下文并绑定。
参见:bind keyword
所以我们使用绑定手动将上下文更改为主对象。