Javascript 如何在浏览器中正确实现异步事件处理程序

Javascript 如何在浏览器中正确实现异步事件处理程序,javascript,asynchronous,events,ecmascript-6,Javascript,Asynchronous,Events,Ecmascript 6,我正在一个老项目中努力解决这个问题,我已经有一段时间了。我也在这里创建了一个,但你可能不需要它 问题是,我有更多的事件处理程序连接到相同的元素上,或者连接到事件将冒泡的链上的元素 问题是,一旦第一个处理程序的代码遇到wait(或者在我使用typescript构建代码时屈服),就会触发下一个处理程序。如何同步执行以等待第一个处理程序中的所有内容完成,然后再继续执行链上的下一个事件处理程序 我看到了一些带有“promisification of event emitter”的示例,但我在这里无法控制

我正在一个老项目中努力解决这个问题,我已经有一段时间了。我也在这里创建了一个,但你可能不需要它

问题是,我有更多的事件处理程序连接到相同的元素上,或者连接到事件将冒泡的链上的元素

问题是,一旦第一个处理程序的代码遇到wait(或者在我使用typescript构建代码时屈服),就会触发下一个处理程序。如何同步执行以等待第一个处理程序中的所有内容完成,然后再继续执行链上的下一个事件处理程序

我看到了一些带有“promisification of event emitter”的示例,但我在这里无法控制事件对象,因为它是由浏览器运行时创建的

我也看到了一些RxJS提示,但是谁能给我一个小样本,他是如何解决这个问题的


一个小东西——有时我还需要等待另一个按钮的执行,点击它可能有它自己的事件处理程序链。

可以认为这是一个黑客攻击,但是你可以在事件对象上构建一个允诺链:

功能延迟(t){
返回新承诺(resolve=>{setTimeout(resolve,t);});
}
函数处理程序(e){
e、 innerColorChangeDone=Promise.resolve(e.innerColorChangeDone)//可能未定义
.然后(()=>延迟(100))
.然后(()=>{
this.style.backgroundColor=“#”+Array.from({length:3},()=>
Math.round(Math.random()*5+9).toString(16)
).加入(“”);
返回延迟(100);
});
}
for(document.getElementsByTagName(“div”)的常量)
el.onclick=处理器
div{
填充:1em;
边框:实心1px#aaa;
宽度:适合的内容;
}

点击

当多个事件侦听器紧密耦合时,为什么会有多个不同的事件侦听器?这的确是个好问题。答案很简单,我需要修复大量的遗留代码,先生。那么您刚才介绍的是异步侦听器,还是这只是一开始就有问题?您好。我们社区中的许多人有时会说,每当他们看到关于软件工程师的性别假设时,他们担心人们感到被排斥。我想知道,你能不能尽量避免在你的帖子中添加以男性为中心的问候语和代词,从而营造一个更受欢迎的环境?谢谢,谢谢,先生!像魅力一样工作!!!我重复了一些类似的东西,但你的例子更好!再次感谢你!现在,问题的另一部分是:当处理程序通过designvoid返回时,我如何使用它自己的事件处理程序链触发不同的元素,并等待它们全部执行?似乎我无法将事件对象作为参数传递给HtmleElement.onclick(),因为.onclick()没有任何输入参数。thxYou当然可以(同样,在处理程序运行后等待事件对象上的承诺),但听起来您希望等待用户单击多个按钮。为此,您需要在应用程序中保持某种状态,而不是仅用事件处理程序来实现。@ RoStayik:如果这是答案,或者实质上促使您找到答案,请考虑接受它。为此,请单击其左侧的勾号图标,以便将其标记为解决方案。这会给帮助过你的人一些时间和精力的声望积分。@halfer你也可以链接到感谢Bergi!我使用了,我应该得到一些东西,包括添加。