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)
Ami*_*mit 11
如果不试图说明未来的决定,那就让我们专注于实用性和已知的事物.
ES7,就像ES6之前一样,它将尝试成为向后兼容的语言扩展.考虑到这一点,向后兼容的构造函数本质上是一个常规函数(有一些运行时限制),意味着用new关键字调用.当这种情况发生时,函数的返回值获得特殊待遇,具体而言,非对象的返回值被忽略,而对象返回值被返回是(和新分配的对象被丢弃)返回新分配的对象.这样,您的代码将导致返回一个承诺,并且不会发生"对象构造".我没有看到这种实用性,我想如果有人花时间找到如何处理这些代码,它将被拒绝.
您可以从返回值中获得一个承诺,然后等待:
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)
| 归档时间: |
|
| 查看次数: |
13051 次 |
| 最近记录: |