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

时间:2016-04-01 18:21:07

标签: javascript async-await ecmascript-next

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

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

4 个答案:

答案 0 :(得分:30)

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

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

答案 1 :(得分:12)

简而言之:

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

答案 2 :(得分:11)

不要试图告诉未来的决定,让我们专注于实用性和已知的事情。

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

答案 3 :(得分: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)
})

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<pre id="result"><code></code></pre>
&#13;
&#13;
&#13;

相关问题