Javascript 可以在构造函数中使用async/await吗?
如问题所述。我是否可以这样做:Javascript 可以在构造函数中使用async/await吗?,javascript,async-await,ecmascript-next,Javascript,Async Await,Ecmascript Next,如问题所述。我是否可以这样做: class MyClass { async constructor(){ return new Promise() } } 不要试图预测未来的决定,让我们专注于实用性和已知的东西 与之前的ES6一样,ES7将尝试成为该语言的向后兼容扩展。考虑到这一点,向后兼容的构造函数本质上是一个常规函数(有一些运行时限制),可以使用new关键字调用。当这种情况发生时,函数的返回值会得到特殊处理,特别是忽略非对象返回值,并返回新分配的对象,同时按
class MyClass {
async constructor(){
return new Promise()
}
}
不要试图预测未来的决定,让我们专注于实用性和已知的东西 与之前的ES6一样,ES7将尝试成为该语言的向后兼容扩展。考虑到这一点,向后兼容的构造函数本质上是一个常规函数(有一些运行时限制),可以使用
new
关键字调用。当这种情况发生时,函数的返回值会得到特殊处理,特别是忽略非对象返回值,并返回新分配的对象,同时按原样返回对象返回值(并丢弃新分配的对象)。这样,您的代码将返回一个承诺,而不会发生“对象构造”。我不认为这有什么实用性,我想如果有人花时间去寻找如何处理这些代码,它将被拒绝。简而言之:
异步构造函数
在概念上存在冲突帕特里克·罗伯茨(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();
您可以从返回值中获得承诺,并等待:
类用户{
构造函数(){
this.promise=this.\u init()
}
异步_init(){
const response=等待获取('https://jsonplaceholder.typicode.com/users')
const users=wait response.json()
this.user=users[Math.floor(Math.random()*users.length)]
}
}
(异步(){
const user=新用户()
等待用户的承诺
返回用户
})()然后(u=>{
$('#result').text(JSON.stringify(u.user,null,2))
}).catch(错误=>{
控制台错误(err)
})
有道理。提案中没有明确规定。我很好奇,因为你仍然可以在构造函数中使用返回值,这样你就不会收到你的实例。我并没有真正的机会仔细阅读这个建议,因此我给出了我的假设答案,但我很有信心这将被定义为静态代码错误。如果他们要添加它,我认为他们还必须添加一些定义异步类的方法,以便您知道如何等待构造函数(听起来很俗气)来绕过Amit提出的问题。Any article ref或spec ref?@AnubhavSaini-我的意思是该对象未被任何变量引用,不可访问,并且稍后会被垃圾收集。语言规范是公开的。async/await不是ES7的一部分。即使可能(提示:不是),一个可能的解决方案是添加一个静态异步
函数,该函数在实际构建MyClass
@Bergi的实例之前进行异步初始化-幸运的是,不管怎样,这些问题都是相关的。感谢您回答了问题的精神,而不是仅仅说“不,这是不允许的。”