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

所以我们使用绑定手动将上下文更改为主对象。