我被困在用 Javascript 睡覺的問題上。我需要以毫秒為單位的睡眠功能。我可以取消在某個地方睡覺。下面是我當前的解決方案(它仍然是錯誤)。
class Delayer {
timeoutId = null
cancelDelay(){
if(this.timeoutId){
clearTimeout(this.timeoutId)
}
}
delay(ms){
return new Promise(resolve => {this.timeoutId = setTimeout(resolve,ms)})
}
}
const delayer = new Delayer()
await delayer.delay(3000)
但是,它并沒有像我預期的那樣作業。因為,當我呼叫 delayer.cancelDelay() (在某個地方)時,它會清除超時并且我的延遲承諾沒有得到解決。
我不知道我的心態是否準確。有人可以幫助我。非常感謝。
uj5u.com熱心網友回復:
將函式保存在resolve物件的屬性中,然后在取消計時器時呼叫它。
class Delayer {
timeoutId = null;
resolve = null;
cancelDelay() {
if (this.timeoutId) {
clearTimeout(this.timeoutId);
this.resolve();
}
}
delay(ms) {
return new Promise(resolve => {
this.resolve = resolve;
this.timeoutId = setTimeout(resolve, ms)
})
}
}
(async() => {
const delayer = new Delayer();
document.getElementById("b").addEventListener("click",
() => delayer.cancelDelay());
console.log("Starting");
await delayer.delay(10000);
console.log("Done");
})();
<button id="b">Click to cancel timer</button>
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/493999.html
標籤:javascript
上一篇:根據id查找和替換陣列中的元素
