Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 可以在构造函数中使用async/await吗?_Javascript_Async Await_Ecmascript Next - Fatal编程技术网

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的实例之前进行异步初始化-幸运的是,不管怎样,这些问题都是相关的。感谢您回答了问题的精神,而不是仅仅说“不,这是不允许的。”