【问题标题】:In es2017, 'this' is undefined when accessed from async methods [duplicate]在 es2017 中,“this”在从异步方法访问时未定义 [重复]
【发布时间】:2017-07-15 17:48:20
【问题描述】:

从异步方法调用时如何引用类实例。

class Senders {
  callSendAPI() {
    //Some code here
  }
  sendText() {
    this.callSendAPI();
  }
  async sendCards() {
    var dbpromise = await db.call();
    console.log('this= ', this);
    this.callSendAPI();
  }
}
export {Senders};

这=未定义

【问题讨论】:

  • 你是在使用 babel 还是别的什么?
  • 如果这听起来像是该转换器中的一个讨厌的错误。
  • sendCards() 怎么称呼?您需要显示该代码,因为它决定了thissendCards() 内的值。问题可能出在您未显示的调用代码中。我会冒险猜测您将obj.sendCards 作为回调传递,这就是它不起作用的原因。如果我的猜测是正确的,请参阅How to get callback to work with “this” in class scope
  • 同意jfriend00。您发布的代码应该按照您期望的方式工作。但是在 js 中,this 的值不是取决于你如何定义函数和类,而是取决于你如何调用函数。因此,您并没有准确地显示导致错误的原因
  • 也许您应该阅读已接受的答案以了解 this 的真正工作原理。请注意,答案中没有与类或异步相关的任何内容,因为它们无关紧要:stackoverflow.com/questions/13441307/…

标签: javascript node.js ecmascript-6 ecmascript-2017


【解决方案1】:

问题在于您正在使用的任何转译器(如果您正在使用一个转译器),或者是给定调用方式的函数的上下文。我在 NodeJS v7.x 中运行了以下 sn-p,它工作得很好,显示 this 的值是 Senders 的一个类实例。

class Senders {
  async sendCards() {
    console.log('this= ', this);
  }
}

new Senders().sendCards();

如果您确定它不是您的转译器,请尝试在调用函数时使用bindcall/apply 控制执行上下文。

【讨论】:

    猜你喜欢
    • 2017-07-03
    • 2016-05-17
    • 2018-04-27
    • 1970-01-01
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 2018-06-03
    相关资源
    最近更新 更多