正如问题所述。我是否可以这样做:
class MyClass {
async constructor(){
return new Promise()
}
}
答案 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)
简而言之:
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;