我搜索了很多,但没有找到关于它的任何内容,只有这个问题。
而且我想要一些异步的解决方案,不依赖循环来检查,所以我采用了不同的解决方案。
主要问题是使用事件监听器解决promisse,所以我在promisse内部创建了eventListener函数,并使用箭头函数获取promisse的上下文。然后我解决了promise并在第一次点击后取消了eventListener。
为了使函数可重用,我也提供了一个入口来处理任何listener。
function waitListener(element, listenerName) {
return new Promise(function (resolve, reject) {
var listener = event => {
element.removeEventListener(listenerName, listener);
resolve(event);
};
element.addEventListener(listenerName, listener);
});
}
如果您想要将其用于某些内容,它将返回该事件。这使您更容易以有序的方式编写一些代码序列。但是,为了使其工作,它必须在异步函数内部,这意味着该函数将开始并行运行,因此重要的是要知道从哪里开始,以免妨碍您的过程。
在某些异步函数中的简单使用:
var element = document.querySelector("button");
await waitListener(element,"click");
一个完整的样例:
function waitListener(Element, ListenerName) {
return new Promise(function (resolve, reject) {
var listener = event => {
Element.removeEventListener(ListenerName, listener);
resolve(event);
};
Element.addEventListener(ListenerName, listener);
});
}
async function awaitClicks(){
var element = document.querySelector("button");
await waitListener(element,"click")
.then(e=>{
console.log("e.clientX: "+e.clientX);
});
console.log(1);
await waitListener(element,"click");
console.log(2);
await waitListener(element,"click");
console.log(3);
}
awaitClicks();
<button>click</button>
如果您需要每次单击按钮时发生相同的事情,最好只使用一个
addEventListener。根据您要执行的操作,您可以使用addEventListener并在其执行的函数中使用
removeEventListener进行取消。现在,如果您想要执行依赖事件顺序的操作,也许使用此函数可以是一个不错的解决方案。
once
而不是on
,因为 Promise 只能成功一次,并且在此之后应自动删除处理程序。 - Bergi