async/await 可以在构造函数中使用吗?

Can async/await be used in constructors?

正如问题所述。我可以这样做吗:

class MyClass {
    async constructor(){
        return new Promise()
    }
}

不要试图算命未来的决定,让我们专注于实用性和已知的东西。

ES7,就像之前的ES6一样,它会尝试做一个向后兼容的扩展语言。考虑到这一点,向后兼容的构造函数本质上是一个常规函数(具有一些运行时限制),它意味着用 new 关键字调用。发生这种情况时,函数的 return 值将得到特殊处理,具体来说,非对象 return 值将被忽略,新分配的对象将被 return 编辑,而对象 return 值将被忽略return按原样编辑(新分配的对象被丢弃)。这样,您的代码将导致 returned 的承诺,并且不会发生 "object construction"。我看不出这有什么实用性,我想如果有人花时间找出如何处理此类代码,它将被拒绝。

简而言之:

  1. 构造函数是需要提供具体对象的函数。
  2. 异步returns 一个承诺;与具体相反。
  3. async constructor 在概念上是矛盾的。

为了扩展 Patrick Roberts 所说的内容,您不能按照您的要求去做,但您可以改为这样做:

class MyClass {
  constructor() {
     //static initialization
  }

  async initialize() {
     await WhatEverYouWant();
  }

  static async create() {
     const o = new MyClass();
     await o.initialize();
     return o;
  }
}

然后在您的代码中像这样创建您的对象:

const obj = await MyClass.create();

您可以从 return 值获得一个承诺,并等待它:

class User {
  constructor() {
    this.promise = this._init()
  }
  
  async _init() {
    const response = await fetch('https://jsonplaceholder.typicode.com/users')
    const users = await response.json()
    this.user = users[Math.floor(Math.random() * users.length)]
  }
}

(async () {
  const user = new User()
  await user.promise
  return user
})().then(u => {
  $('#result').text(JSON.stringify(u.user, null, 2))
}).catch(err => {
  console.error(err)
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<pre id="result"><code></code></pre>