一次设置多个超时 运行

mutliple set timeouts running at once

所以,我有一个 for 循环,我想 运行 一次设置多个超时,这样它就可以连续多次检查是否是某个时间。我不能一次检查所有多次,检查需要在不同的时间后重复。它只会继续重复循环的最后一次迭代,即纬度中的最后一个字典。

我的方法稍微简化了一点:

lat = list of dictionaries with some values that differentiate them + times
for(i = 0; i< lat.length; i++){

if(lat[i][differentiate value]) = {

function checktime(){
   if(currenttime != lat[i]){
setTimeout(checktime,30000)
}
else{
console.log("yay the time is right!")
}

}

else if(lat[i][differentiate value]) = {

function checktime(){
   if(currenttime != lat[i]){
setTimeout(checktime,50000)
}
else{
console.log("yay the time is right!")
}

}

}

我将如何制作这个(它用于通知应用程序)

原代码: (后面的每个值看起来像 [[75,null,[7,28,2021]], null,[[9,52,"p"]],"e&r"] 带有通知数量,预设日期,这些提醒的日期,按时间,这将是第一个 if,以及 attimes 的数组。为了测试,我有 2 个 laters,有 2 个不同的 attimes):

 chrome.storage.sync.get('later', function(data){
        if (data.later !== null){
        var lat = data.later;
        
        for(i = 0; i< lat.length; i++){
            var currentDict = lat[i];
            
                if(currentDict['notis'][1] !== null){
                    console.log("cheese")
                    var by = currentDict['notis'][1];
                    console.log(by)

                    const d = new Date();
                        var hr = d.getHours();
                        var min = d.getMinutes();
                        var sec = d.getSeconds();
                        
                        var da = currentDict['notis'][0][2][1];
                        var mo = currentDict['notis'][0][2][0];
                        var ye = currentDict['notis'][0][2][2]
                        var h = by[0];
                        var m = by[1];
                        var ampm = by[2];
                        if(ampm == "p"){
                        h = h + 12;
                        }

                        var byMS = h*3600000 + m*60000;
                        var currentMS = hr*3600000 + min*60000 + sec*1000;

                        //check if right date then check if time is lesss than

                    
                    function checkdate(){
                        var day = d.getDate();
                        var month = d.getMonth() + 1;
                        var year = d.getFullYear();
                        if(da == day && mo == month && ye == year){
                            var amt = 0;
                            function checktime(){
                            if(byMS >= currentMS){
                                //noti and delete
                                var int = setInterval(function(){

                                    chrome.notifications.create({
                                        title: currentDict['name'],
                                        message: "do da " + currentDict['name'],
                                        iconUrl: "logo.png",
                                        type: "basic"
                                
                                    })
    
                                    amt++
                                    console.log(amt)
                                    const dddd = new Date();
                                    console.log(dddd.getMinutes() + " / " + dddd.getSeconds())
                                    if(amt >= currentDict['notis'][0][0]){
                                        clearInterval(int)
                                        console.log("done")
                                        //ju finish taht
                                        console.log(lat)
                                            lat.splice(lat.indexOf(currentDict),1)
                                            console.log(lat)
                                            chrome.storage.sync.set({'later': lat})
                                        
                                    }
                                }, (byMS-currentMS)/currentDict['notis'][0][0])
                            }
                            else{
                                setTimeout(checktime,30000)
                            }
                        }
                        checktime();
                        }
                        else{
                            setTimeout(checkdate,66400000)
                        }
                    }
                    checkdate();
                }
                else if(currentDict['notis'][2] !== null){
                    

                    console.log("cheese")
                    var at = currentDict['notis'][2];
                    console.log(at)
                    
                    var arrayat = [];
                for(j = 0; j<= at.length-1; j++){
                    var atcycle = at[j];
                    console.log(atcycle)
                    const ddd = new Date();
                    var hr = ddd.getHours();
                    var min = ddd.getMinutes();
                    
                    var da = currentDict['notis'][0][2][1];
                    var mo = currentDict['notis'][0][2][0];
                    var ye = currentDict['notis'][0][2][2]
                    var hrat = atcycle[0];
                    var minat = atcycle[1];
                    var ampm = atcycle[2];
                    if(ampm == "p"){
                    hrat = hrat + 12;
                    }
                    console.log(hrat + "/" + minat + "/" + ampm)
                    if(hr <= hrat){
                           
                        var temparray = [];
                        temparray.push(hrat)
                        temparray.push(minat)
                        arrayat.push(temparray);
                        console.log(arrayat)
                         }
                          
                    else if(hr == hrat){
                            if(min<minat){
                                var temparray = [];
                                temparray.push(hrat)
                                temparray.push(minat)
                                arrayat.push(temparray);
                                console.log(arrayat)}
                                }       
                        }      
                        console.log(arrayat.length)     
                    function checkdate(){
                        console.log(arrayat.length)
                        console.log("date")
                        const d = new Date();
                        var day = d.getDate();
                        var month = d.getMonth() + 1;
                        var year = d.getFullYear();
                        if(da == day && mo == month && ye == year){
                            function check(){
                                console.log(arrayat.length)
                                console.log("check")
                                for(l=0; l<arrayat.length; l++){
                                    console.log(arrayat.length)
                                const dd = new Date();
                                var hr = dd.getHours();
                                var min = dd.getMinutes();
                                console.log(arrayat[l][1])
                                console.log(min)
                                if(arrayat[l][0] == hr && arrayat[l][1] == min ){ //at one of the times
                                    console.log(arrayat)
                                    arrayat.splice(l,1)
                                    console.log(arrayat)
                                    if(arrayat.length == 0){
                                        lat.splice(lat.indexOf(currentDict),1)
                                        chrome.storage.sync.set({'later': lat})
                                        console.log(lat)
                
                                    }
                                    chrome.notifications.create({
                                        title: currentDict['name'],
                                        message: "do da " + currentDict['name'],
                                        iconUrl: "logo.png",
                                        type: "basic"
                                
                                    })
                                    //add noti with name and delete it
                                    console.log(arrayat)
                                    check();
                                     }
                                }
                                console.log(arrayat.length)
                                if(arrayat.length !== 0){
                                    console.log("and repeat")
                                    setTimeout(check,15000);//SETINTERVAL INSTEAD? ANDCLEAR
                                }
                                
                            }
                            check();
                            }
                            else{
                            setTimeout(checkdate,66400000)
                            }
                     }
                     checkdate();
                             
                }

                
            }
           }
          
    })
    }




这是错误的做法。你知道时间,所以你知道他们在时间上有多远。如果时间到了,您无需一遍又一遍地检查。而是算出距离相关时间还有多少毫秒,然后为该时间设置超时。

你基本上需要将不同的函数传递给每个 setTimeout():

function checktime1(){
   if(currenttime != lat[i]){
       setTimeout(checktime1,30000)
   }
   else{
       console.log("yay the time is right!")
   }
}

function checktime2(){
   if(currenttime != lat[i]){
       setTimeout(checktime2,50000)
   }
   else{
       console.log("yay the time is right!")
   } 
}

但是,这显然是不可扩展的。如果你有很多超时,你会写很多重复的函数。更糟糕的是,如果您有动态数量的超时,这将无法解决您的问题。

幸运的是,javascript 让我们可以在另一个函数中声明函数:

function checktime(timeout){

    function loop () {
        if(currenttime != lat[i]){
            setTimeout(loop,timeout)
        }
        else{
            console.log("yay the time is right!")
        }
    }
    loop();
}

这允许您根据需要动态创建函数:

checktime(30000);
checktime(50000);

如果您需要将参数传递给每个超时(例如,如果您需要显示自定义警报),您可以将它传递给您的外部函数,它将在闭包中捕获:

function checktime(timeout, message){

    function loop () {
        if(currenttime != lat[i]){
            setTimeout(loop,timeout)
        }
        else{
            console.log(message)
        }
    }
    loop();
}

那么你可以这样做:

checktime(30000, "Yay, the time is right for timer 1");
checktime(50000, "Yay, the time is right for timer 2");

同样,如果您需要为每个定时器执行自定义逻辑,您也可以将其作为参数(回调)传递:

function checktime(timeout, callback){

    function loop () {
        if(currenttime != lat[i]){
            setTimeout(loop,timeout);
        }
        else{
            console.log("yay the time is right!");

            callback(); // <----------------- execute custom logic
        }
    }
    loop();
}

你可以像这样使用:

checktime(30000, () -> console.log("TIMER 1"));
checktime(50000, () -> alert("TIMER 2"));