javascript - JavaScript 中的异步事件处理
问题描述
我在防止eventListener
代码中的双重(多重)处理方面遇到问题:
var locked;
button.addEventListener("click", function() {
if (locked) return;
locked = true;
calculateSomethingHeavy();
locked = false;
}
第二次立即按钮单击会触发另一个事件,尽管locked == true
. button.disabled = true
类似或setTimeout(function() {locked = true;}, 0)
没有效果的事情是因为(我猜)第二次调用是堆叠的,并且只有在第一次完全处理后才会被调用。我想我错过了一些异步事件处理的整体技术。如何在纯js中做到这一点?
解决方案
这里的正确答案取决于 的定义calculateSomethingHeavy
。根据问题标题,它可能是异步的,但可以使用回调、事件、承诺或异步/等待来实现。
无论其中哪一个在这里起作用,您需要做的是确保在完成之前locked
不会设置为。在每种情况下,这可能如下所示......false
calculateSomethingHeavy
回调
var locked;
button.addEventListener("click", function() {
if (locked) return;
locked = true;
calculateSomethingHeavy(() => {
locked = false;
});
});
活动
var locked;
button.addEventListener("click", function() {
if (locked) return;
locked = true;
calculateSomethingHeavy().on('finish', () => {
locked = false;
});
});
承诺
var locked;
button.addEventListener("click", function() {
if (locked) return;
locked = true;
calculateSomethingHeavy()
.then(() => {
locked = false;
});
});
异步/等待
var locked;
button.addEventListener("click", async function() {
if (locked) return;
locked = true;
await calculateSomethingHeavy();
locked = false;
});
推荐阅读
- python - 回调返回训练和验证性能
- c - 查找以太网标头的下一跳 MAC 地址
- android - Android TextView 的选取框在 RecyclerView 中无法正常工作
- apache-spark - 从驱动程序中获取 spark 驱动程序 ID
- sql - 如何在内部查询列中使用外部查询列
- spark-streaming - 含义输入记录 Spark
- hyperledger-fabric - 想要使用 Hyperledger Febric 为多个注册用户创建应用程序
- python - 将大矩阵拆分为多个较小的矩阵 - 困难
- json - rabbitmq 消息中的意外符号和文档末尾的垃圾
- javascript - Struts2 - Escape string in value attribute of textfield tag