异步函数可以在 class 字段中吗?

Can async functions be in class fields?

考虑以下片段:

class Foo {
  method = () => {
    console.log('method');
  }
}
const f = new Foo();
f.method();

工作正常。但是,如果函数改为异步,没有其他更改:

class Foo {
  method = async () => {
    console.log('method');
  }
}
const f = new Foo();
f.method();

这会导致语法错误。无论是否使用箭头函数都会发生:

class Foo {
  method = function() {
    console.log('method');
  }
}
const f = new Foo();
f.method();

class Foo {
  method = async function() {
    console.log('method');
  }
}
const f = new Foo();
f.method();

是我的语法不正确,还是在 class 字段中简单地禁止了异步函数?

(当然,原型上的普通异步方法也是可能的,但我要求 why/how class 字段中的异步函数可以工作)

采纳评论async method() => {的建议也不行:

class Foo {
  async method() => {
    console.log('method');
  }
}
const f = new Foo();
f.method();

问:这对你有用吗:

class Foo {
  async method () {
    console.log('method');
  }
}
const f = new Foo();
f.method();

根据 mozilla 这种语法在 IE 中不受支持,我猜测你在那里遇到了错误,你的第二个示例工作在 chrome.

中打招呼

class Foo {
  method = async () => {
    console.log('method');
  }
}
const f = new Foo();
f.method();

Can async functions be in class fields?

是的。

//Without BabelJS / ES2015
class Foo {
  method = async () => {
    console.log('method');
  }
}
const f = new Foo();
f.method();

Can async functions be in class fields when using an ES2015 transpiler?

没有。

//Without BabelJS / ES2015
class Foo {
  method = async () => {
    console.log('method');
  }
}
const f = new Foo();
f.method();

asyncECMAScript 2017 (ECMA-262) 一起引入。

在您的代码片段中,您启用了 Use Babel / ES2015,早于 async