如何从循环内的函数 setTimeout 更改变量



如何使用下述条件将变量dinamic_delay替代值?

var emails = []; // array 
var number = 5;
var count = 0;
var dinamic_delay;
for (i = 0; i < emails.length; i++) {
    count++;
    if (count == number) {
        dinamic_delay = 3000;
        count = 0; // resset count
    } else {
        dinamic_delay = 500;
    }
    setTimeout(function (i) {
        sendemail(email[i]);
    }, dinamic_delay * i, i);
}

我不得不提醒自己setTimeout是如何工作的:

setTimeout(myfunction((, 5000( - 从现在起至少 5000 毫秒后调用函数(执行此代码时(

setTimeout(myfunction((, 5000( - 从现在起至少 5000 毫秒后调用函数(当执行此代码时(

换句话说,在调用 B 之前没有自动的 10,000 毫秒,例如 6000 毫秒

如果你想定期调用事物,setInterval 很有用。

下面的示例显示控制台消息 3、3、3、3、10 秒.log并重复,直到最后一封电子邮件。

    const bigDelay_c = 10000;  //secs
    const smallDelay_c = 3000;  //secs
    const totalEmails_c = 18;   //total to process
    var totalEmailsProcessed = 0; //running total
    var timerId = 0;
    timerId = setInterval(alertFunc, smallDelay_c);

    function alertFunc() {
        //sendEmail logic here
        var currentdate = new Date();
        totalEmailsProcessed++;
        console.log(totalEmailsProcessed, currentdate.getHours() + ":" +
            currentdate.getMinutes() + ":" + currentdate.getSeconds());
        clearInterval(timerId);  //stop interval repeating
        //stop if all emails have been processed
        if (totalEmailsProcessed >= totalEmails_c) {
            console.log('all emails processed');
            return;
        }

        //5th item in every 5 get bigDelay_c
        if (totalEmailsProcessed % 5 == 4)
            timerId = setInterval(alertFunc, bigDelay_c);
        else
            timerId = setInterval(alertFunc, smallDelay_c);

    }

最新更新