Итак, я узнал из ответов, что setTimeout
создает новый независимый таймер каждый раз, когда move()
выполняется. Насколько я понимаю, каждый новый таймер перезаписывает предыдущий, но поскольку это не тот случай, я должен был думать о чем-то другом.
Я действительно не объяснил, что мне действительно нужно было достичь с задержкой, поэтому позвольте мнеуточнить. Я хочу создать тайм-аут для действия, если это действие не было выполнено в течение x времени. Использование setTimeout в действии само по себе создало проблему, заключающуюся в том, что в действии потенциально может быть несколько выполнений в очереди, ожидающих выполнения даже после событий mouseup.
Поэтому вместо этого я использовал setTimeout для новой переменной, которая действует как блокировка длядействие. В результате получается следующий код:
var active = false;
var actionTimeout = false;
var actionTimeStamp;
var actionLock = false;
window.addEventListener("mousedown", down, false);
window.addEventListener("mouseup", up, false);
window.addEventListener("mousemove", move, false);
function down(e) {
active = true;
console.log("down")
window.scrollTo(0,document.body.scrollHeight);
}
function up(e) {
active = false;
console.log("up")
window.scrollTo(0,document.body.scrollHeight);
}
function move(e) {
if (active) {
if ((Date.now() - actionTimeStamp > 500) && (!actionTimeout)) { // get time elapsed and compare to threshold (500ms)
actionTimeout = true; //this is for the if statement above to prevent multiple timeouts
actionLock = false; // set the lock
setTimeout(function() { // remove lock after 50ms
actionTimeout = false;
actionLock = true;
actionTimeStamp = Date.now(); // timestamp here to make sure we don't lock again to soon. (helps if setTimeout is => than threshold.
}, 50);
}
if (actionLock) { //do our action
console.log("move")
window.scrollTo(0,document.body.scrollHeight);
actionTimeStamp = Date.now(); // timestamp last execution
}
}
}
Спасибо всем за участие в комментариях и ответах. Очень ценят.