“await this.method();” doesn’t work in static method

拜拜、爱过 提交于 2021-02-08 13:45:24

问题


I know of the ES6 await feature and I’d like to use it in a function I created in a class.

It works well, but when the function is a static function, it doesn’t. Is there any reason for that? Also, what will be the right way to be able to use await inside a static function?

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();

回答1:


You can use await just fine in a static function. That is not your issue.

BUT, this in a static function is MyClass so this.someMethod() is looking for another static method, not an instance method and resolveAfter2Seconds() is an instance method, not a static method so this.resolveAfter2Seconds() won't find that method because that's like calling MyClass.resolveAfter2Seconds() which doesn't exist.

If you also make resolveAfter2Seconds() be static, then it would probably work because this inside asyncCall() is MyClass so this.resolveAfter2Seconds() is looking for another static method.

This should work where you make resolveAfter2Seconds also be static:

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"
  }
}

Or, you could reach into the prototype and call it from there because it is actually a static method (doesn't reference this at all):

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



回答2:


You're calling await this.resolveAfter2Seconds(); as if the this was an instantiation of MyClass, but in the context that your'e calling it, it isn't - resolveAfter2Seconds is a method on the prototype of MyClass, it's not a property of the class itself. Call the prototype method instead:

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();


来源:https://stackoverflow.com/questions/49620379/await-this-method-doesn-t-work-in-static-method

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!