【发布时间】:2021-12-04 00:59:27
【问题描述】:
我正在尝试使用一个异步功能,如果它被召回,它会重置。该函数链接多个按钮,触发一个div作为通知覆盖框。
我想,当 callAlert() 函数再次被调用时,它会重置 clearAlert() 的超时时间。我尝试在调用 newAlert 时增加 1500 毫秒,但我假设当单击任何按钮(触发 callAlert())时,它已经移到 clearAlert() 承诺上。要么这样,要么我的等待时间越来越长。
任何建议都会很棒。
let alertActive = false;
let alertCd = 0;
function newAlert(){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
alert_pop.classList.remove("alert_pop");
alertActive=true;
alertCd = 1500
resolve();
} , 100);
});
}
function clearAlert(){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
alert_pop.classList.add("alert_pop");
alert_string.innerHTML="";
resolve();
} , alertCd);
alertActive=false;
});
}
async function callAlert(){
await newAlert();
await clearAlert();
}
【问题讨论】:
-
1.保存 timeoutID returned by
setTimeout()。 2. 任何时候需要创建一个新的警报,cancel the last timer usingclearTimeout(),然后创建一个新的超时。 3.如果你需要取消现有的定时器(根据描述,你不需要),使用clearTimeout()。 -
clearTimeout() 会完成 clearAlert() 上的承诺吗?
-
不会。 ……需要吗?
clearAlert()创建自己的 Promise 并尝试设置自己的超时,我不知道为什么。您应该更改clearAlert()以不返回 Promise。它不需要一个。首先,在newAlert()中,将活动Promise 中的resolve或reject保存到clearAlert()可以访问的范围内。然后,在clearAlert()中,调用clearTimeout()和resolve()或reject()(取决于您要执行的操作)。 -
已更新至此,它似乎可以解决问题 - 谢谢!您能否将其发布为答案,以便我将其标记为已回答?
-
啊哈;是的,我是。通过排除简单的问题,将其他人的问题作为自己的学习经验。
标签: javascript asynchronous promise