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"。我看不出这有什么实用性,我想如果有人花时间找出如何处理此类代码,它将被拒绝。
简而言之:
- 构造函数是需要提供具体对象的函数。
- 异步returns 一个承诺;与具体相反。
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>
正如问题所述。我可以这样做吗:
class MyClass {
async constructor(){
return new Promise()
}
}
不要试图算命未来的决定,让我们专注于实用性和已知的东西。
ES7,就像之前的ES6一样,它会尝试做一个向后兼容的扩展语言。考虑到这一点,向后兼容的构造函数本质上是一个常规函数(具有一些运行时限制),它意味着用 new
关键字调用。发生这种情况时,函数的 return 值将得到特殊处理,具体来说,非对象 return 值将被忽略,新分配的对象将被 return 编辑,而对象 return 值将被忽略return按原样编辑(新分配的对象被丢弃)。这样,您的代码将导致 returned 的承诺,并且不会发生 "object construction"。我看不出这有什么实用性,我想如果有人花时间找出如何处理此类代码,它将被拒绝。
简而言之:
- 构造函数是需要提供具体对象的函数。
- 异步returns 一个承诺;与具体相反。
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>