重新激活时强制重置承诺

Force reset promise when re-activated

我正在尝试拥有一个异步功能,如果它被召回,它会重置。此功能链接到多个按钮,并触发一个 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();
}

为了确保 JavaScript 函数不会每隔几秒调用一次以上,您可以 运行 将其包装在 lodash 中可用的“去抖动”函数中。

这里有一个很好的解释example

创建一个可重置的计时器

如果你想创建一个可以重置的计时器,

  1. 保存由 setTimeout()编辑的超时 ID return。
  2. 任何时候需要创建新警报时,使用 clearTimeout() 取消最后一个计时器,然后创建新的超时。

取消定时器

如果您需要取消现有计时器,请使用clearTimeout()。现在,clearAlert() 创建自己的 Promise 并尝试设置自己的超时。您应该将 clearAlert() 更改为 return Promise(至少,目前如此。看起来您可能正在尝试延迟取消)。

首先,在 newAlert() 中,将活动 Promise 中的 resolve 或 reject 保存到 clearAlert() 可访问的范围。然后,在 clearAlert() 中调用 clearTimeout()resolve()reject()(取决于您要执行的操作)。