目前,我正在尝试在类构造函数中使用 async/await
。这样我就可以为我正在处理的 Electron 项目获取自定义 e-mail
标签。
customElements.define('e-mail', class extends HTMLElement {
async constructor() {
super()
let uid = this.getAttribute('data-uid')
let message = await grabUID(uid)
const shadowRoot = this.attachShadow({mode: 'open'})
shadowRoot.innerHTML = `
<div id="email">A random email message has appeared. ${message}</div>
`
}
})
但是,目前该项目无法正常工作,并出现以下错误:
Class constructor may not be an async method
有没有办法规避这个问题,以便我可以在其中使用 async/await?而不是需要回调或 .then()?
原文由 Alexander Craggs 发布,翻译遵循 CC BY-SA 4.0 许可协议
这 永远 行不通。
async
关键字允许在标记为async
的函数中使用await
,但它也将该函数转换为 promise 生成器。因此,标有async
的函数将返回一个 Promise。另一方面,构造函数返回它正在构造的对象。因此,我们遇到了一种情况,您希望同时返回一个对象和一个承诺:一种不可能的情况。您只能在可以使用 Promise 的地方使用 async/await,因为它们本质上是 Promise 的语法糖。您不能在构造函数中使用 Promise,因为构造函数必须返回要构造的对象,而不是 Promise。
有两种设计模式可以克服这个问题,它们都是在 Promise 出现之前发明的。
init()
函数。这有点像 jQuery 的.ready()
。您创建的对象只能在它自己的init
或ready
函数中使用:用法:
执行:
用法:
执行:
使用 async/await 实现:
注意在静态函数中调用函数。
这与异步构造函数无关,而是与关键字
this
的实际含义有关(对于来自对方法名称进行自动解析的语言的人来说,这可能有点令人惊讶,即不需要this
关键字的语言)。this
关键字指的是实例化的对象。不是班级。因此,您通常不能在静态函数中使用this
,因为静态函数没有绑定到任何对象,而是直接绑定到类。也就是说,在下面的代码中:
你不能这样做:
相反,您需要将其称为:
因此,以下代码将导致错误:
要修复它,您可以将
bar
设为常规函数或静态方法: