“await this.method();”在静态方法中不起作用

时间:2018-04-03 00:02:07

标签: javascript static async-await es6-promise es6-class

我知道ES6 await功能,我想在我在课堂上创建的函数中使用它。

效果很好,但是当函数是static函数时,它不会。有什么理由吗?此外,在await函数中使用static的正确方法是什么?

class MyClass {
  resolveAfter2Seconds() {
    return new Promise(resolve => {
      setTimeout(() => {
        resolve('resolved');
      }, 2000);
    });
  }

  static async asyncCall() {
    console.log('calling');
    var result = await this.resolveAfter2Seconds();
    console.log(result);
    // expected output: "resolved"
  }
}

MyClass.asyncCall();

2 个答案:

答案 0 :(得分:2)

您可以在静态函数中使用await。那不是你的问题。

但是,静态函数中的thisMyClass所以this.someMethod()正在寻找另一个静态方法,而不是实例方法而resolveAfter2Seconds()是一个实例方法,而不是静态方法,this.resolveAfter2Seconds()无法找到该方法,因为这类似于调用MyClass.resolveAfter2Seconds()并不存在。

如果您还resolveAfter2Seconds()static,那么它可能会有效,因为this内的asyncCall()MyClass所以this.resolveAfter2Seconds()正在寻找另一种静态方法。

这应该适用于resolveAfter2Seconds也是静态的地方:

class MyClass {

  static resolveAfter2Seconds() {
    return new Promise(resolve => {
      setTimeout(() => {
        resolve('resolved');
      }, 2000);
    });
  }

  static async asyncCall() {
    console.log('calling');
    var result = await this.resolveAfter2Seconds();
    console.log(result);
    // expected output: "resolved"
  }
}

或者,你可以进入原型并从那里调用它,因为它实际上是一个静态方法(根本没有引用this):

  static async asyncCall() {
    console.log('calling');
    var result = await MyClass.prototype.resolveAfter2Seconds();
    console.log(result);
    // expected output: "resolved"
  }

答案 1 :(得分:2)

您正在调用await this.resolveAfter2Seconds();,就好像thisMyClass的实例,但在您调用它的情况下,它不是' t - resolveAfter2SecondsMyClass原型上的一种方法,它不是该类本身的属性。改为调用原型方法:



class MyClass {
  resolveAfter2Seconds() {
    return new Promise(resolve => {
      setTimeout(() => {
        resolve('resolved');
      }, 2000);
    });
  }
  static async asyncCall() {
    console.log('calling');
    var result = await this.prototype.resolveAfter2Seconds();
    console.log(result);
    // expected output: "resolved"
  }

}
MyClass.asyncCall();