【发布时间】:2017-09-11 21:28:33
【问题描述】:
目前,我正在尝试在类构造函数中使用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()?
【问题讨论】:
-
构造函数的目的是为你分配一个对象,然后立即返回。您能否更具体地说明究竟为什么您认为您的构造函数应该是异步的?因为我们几乎可以保证在这里处理XY problem。
-
@Mike'Pomax'Kamermans 这很有可能。基本上,我需要查询数据库以获取加载此元素所需的元数据。查询数据库是一个异步操作,因此在构造元素之前我需要某种方式来等待它完成。我宁愿不使用回调,因为我在整个项目的其余部分都使用了 await/async,并且希望保持连续性。
-
@Mike'Pomax'Kamermans 完整的上下文是一个电子邮件客户端,其中每个 HTML 元素看起来都类似于
<e-mail data-uid="1028"></email>,并使用customElements.define()方法填充信息。跨度> -
你几乎不希望构造函数是异步的。创建一个返回对象的同步构造函数,然后使用
.init()之类的方法来执行异步操作。另外,由于您是子类 HTMLElement,因此使用此类的代码极有可能不知道它是异步的,因此您可能不得不寻找完全不同的解决方案。
标签: javascript node.js async-await