You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

async函数中await执行时event参数是否会被覆盖?求官方依据

慢速网络下Lit Element事件监听器中event.detail异常的原因与官方依据

问题现象

在浏览器端慢速网络环境中,作为Lit Element事件监听器的异步类方法doUpdate出现异常:原本在await远程请求完成后,通过e.detail.anotherid查找实体偶尔失败;但将e.detail提前存入当前作用域的const data变量后,问题完全消失。

代码背景

父组件渲染逻辑

render() {
 return html`
  ${this.entities.map(entity => html`
    <entity-editor .entity=${entity} @entity-changed=${this.doUpdate}></entity-editor>
  `)}
 `;
}

子组件事件触发逻辑

this.dispatchEvent(new CustomEvent('entity-changed', {
  bubbles: true,
  composed: true,
  detail: {
   anotherid: this.id,
   moreinfo: this.moreinfo
  }
}));

远程请求逻辑

readSomethingFromRemoteDatabase仅将参数转为fetch POST请求,用JSON.stringify处理请求体。

推测验证与官方依据

你的核心推测方向正确,更准确的原因是浏览器对事件对象的重用机制:

  • 部分浏览器会在事件处理流程同步执行结束后,重用事件对象以优化性能。当doUpdate作为异步函数,await远程请求的过程中,当前事件的同步处理流程已完成,浏览器可能将该事件对象重新分配给后续触发的entity-changed事件。此时再访问e.detail,实际指向的是新事件的detail对象,导致第一次调用中原本的anotherid被覆盖。
  • 提前将e.detail存入const data后,data会保留对原事件detail对象的引用,而你触发事件时构造的detail是独立对象,不会被后续事件修改,因此彻底避免了问题。

官方依据:根据DOM规范,事件对象属于一次性使用的对象,在事件处理函数的同步执行阶段结束后,浏览器有权重用该对象。因此在异步操作中直接依赖事件对象的属性存在风险,必须提前将所需数据提取到当前作用域中。

内容的提问来源于stack exchange,提问作者akc42

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 16:05:58