async/await是否允许我们在构造函数上使用?

win*_*ter 18 javascript async-await ecmascript-next

正如问题所述.我会被允许这样做:

class MyClass {
    async constructor(){
        return new Promise()
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 34

为了扩展帕特里克罗伯茨所说的内容,你不能做你想要的,但你可以这样做:

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

  async initialize() {
     await WhatEverYouWant();
  }

  static async create() {
     const o = new MyClass();
     await o.initialize();
     return o;
  }
}
Run Code Online (Sandbox Code Playgroud)

然后在你的代码中创建你的对象:

const obj = await MyClass.create();
Run Code Online (Sandbox Code Playgroud)

  • 感谢您回答问题的实质,而不是仅仅说“不,这是不允许的”。 (2认同)

小智 12

简而言之:

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


Ami*_*mit 11

如果不试图说明未来的决定,那就让我们专注于实用性和已知的事物.

ES7,就像ES6之前一样,它将尝试成为向后兼容的语言扩展.考虑到这一点,向后兼容的构造函数本质上是一个常规函数(有一些运行时限制),意味着用new关键字调用.当这种情况发生时,函数的返回值获得特殊待遇,具体而言,非对象的返回值被忽略,而对象返回值被返回是(和新分配的对象被丢弃)返回新分配的对象.这样,您的代码将导致返回一个承诺,并且不会发生"对象构造".我没有看到这种实用性,我想如果有人花时间找到如何处理这些代码,它将被拒绝.


Ben*_*kin 5

您可以从返回值中获得一个承诺,然后等待:

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)
})
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<pre id="result"><code></code></pre>
Run Code Online (Sandbox Code Playgroud)