[英]How to Prevent Timeout Function from Running Twice
如果在1000毫秒后沒有輸入新數據,我試圖自動將數據從輸入字段傳遞給函數。 但是,它的行為是不一致的,有時該函數在單個輸入上運行兩次。
<paper-input id="itemId" on-input="automaticInput"></paper-input>
...
automaticInput() {
let timeout = null;
let that = this;
console.log(timeout); // logging each keystroke
input();
function input() {
console.log('input');
clearTimeout(timeout);
timeout = setTimeout(function() {
that.validateInput();
}, 1000);
}
}
validateInput() {
if (this.$.itemId.value) {
this.doSomething(); // runs twice
}
}
如何正確設置automaticInput函數以使每個輸入字符串僅運行一次?
您需要的是一個反跳功能。 您的代碼大部分位於此處,只需將timeout var從automaticInput
移出:
let timeout = null;
automaticInput() {
clearTimeout(timeout);
let that = this;
timeout = setTimeout(function() {
that.validateInput();
}, 1000);
}
或更好地創建去抖動fn像這樣:
function debounce(fn, timeout = 0) {
let timeoutId = null;
return (...args) => {
clearTimeout(timeoutId);
timeoutId = setTimeout(() => fn(...args), timeout);
}
}
然后您的代碼變為:
const debouncedValidateInput = debounce(this.validateInput.bind(this), 1000);
<paper-input id="itemId" on-input="debouncedValidateInput"></paper-input>
如果您使用lodash
之類的lodash
則該工具已隨附此類幫助器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.