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
相关产品推荐
相关产品推荐

