我在阻止代码中进行双重(多个)QSqlDatabase::database().driver()->hasFeature(QSqlDriver::Transactions); //returns false
QSqlDatabase::database().transaction(); //raises exception
处理方面遇到问题:
eventListener
第二次立即单击按钮会触发另一个事件,尽管有var locked;
button.addEventListener("click", function() {
if (locked) return;
locked = true;
calculateSomethingHeavy();
locked = false;
}
。 locked == true
或button.disabled = true
之类的东西无效,因为(我猜)第二个调用是堆叠的,只有在第一个调用得到完全处理后才会被调用。我想我缺少异步事件处理的全部技术。如何在纯js中做到这一点?
答案 0 :(得分:1)
此处的正确答案取决于calculateSomethingHeavy
的定义。大概它基于问题标题是异步的,但是可以使用回调,事件,promise或async / await来实现。
无论使用哪种功能,都需要确保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", function() {
if (locked) return;
locked = true;
await calculateSomethingHeavy();
locked = false;
});