0

我有以下带有 if 条件的代码

if(oldMembership++ <= newMembership) {
    var digit;
    $('ul#indexSiteCounterBottom').empty();

    for(i = 0; i < 9; i++) {
        if(membership.toString()[i] == '_') {
            digit = '&nbsp;';
        } else {
            digit = membership.toString()[i];
        }

        $('ul#indexSiteCounterBottom').append('<li>'+digit+'</li>');
        $('ul#indexSiteCounterBottom li:nth-child(3n)').addClass('extra-margin');
    }
}

如果满足“if”条件,则运行其余代码。

对于“if”的每个循环,我希望能够将以下代码的运行速度减慢大约 500 毫秒。

我尝试放入 setInterval 和 setTimeout 但我之前没有使用过它们,并且“if”条件立即完成了所有循环。

如何向其中添加 setInterval 或 SetTimeout 以便每个“if”循环延迟 500 毫秒?一旦满足“if”条件,它应该退出计时器/if 条件。

非常感谢你...

4

3 回答 3

3
if(membership.toString()[i] == '_') {
    digit = '&nbsp;';
    setTimeout(function () {
        digitThing(digit);
    }, 500);
}
else {
    digit = membership.toString()[i];
    digitThing(digit);
}
function digitThing(digit) {
    $('ul#indexSiteCounterBottom').append('<li>'+digit+'</li>');
    $('ul#indexSiteCounterBottom li:nth-child(3n)').addClass('extra-margin');
}
于 2013-02-08T03:53:07.510 回答
1

setTimeout是用于延迟函数执行的函数

你可以像这样使用它:

var to = setTimeout(function() {

    // Your code that will be executed after 500 ms

}, 500);

如果您想在 500 毫秒之前取消呼叫,您可以使用tovar 并调用clearTimout(to). 这将取消超时,并且您的函数将不会在 500 毫秒后运行。

setInterval与 不同,setTimeout因为它将每 500 毫秒运行一次您的函数,无需任何操作。它可以被视为一个调度器。

你可以像这样使用它:

var iv = setInterval(function() {

    // Your code that will be executed every 500ms

}, 500);

如果要停止计划的进程,可以使用ivvar 并调用clearInterval(iv). 这将取消 qscheduler。

setTimeout在您的情况下,如果您想在每次通话中保持联系,您应该使用。

例如,您可以编写如下内容:

// Launch the task if the main test is ok
if(oldMembership++ <= newMembership) {

    // Empty your main UL
    $('ul#indexSiteCounterBottom').empty();

    // Run the first process without timeout
    runProcess(0, 500);
}

// Run one process
function runProcess(i, ms)
{
    // Stop the recursivity when the end of the string is reached
    if (i >= membership.toString().length)
        return;

    // Set default value for the digit
    var digit = membership.toString()[i];

    // Override the digit if requiered
    if(digit == '_')
        digit = '&nbsp;';

    // Finally process the digit
    $('ul#indexSiteCounterBottom').append('<li>'+digit+'</li>');
    $('ul#indexSiteCounterBottom li:nth-child(3n)').addClass('extra-margin');

    // Run the next process in 500ms
    setTimout(function() {
        runProcess(i+1, ms);
    }, ms);
}
于 2013-02-08T03:58:47.273 回答
1

我认为这可以解决您的问题...

function execute_if_membership(){
    setTimeout(function(){
        var digit;
        $('ul#indexSiteCounterBottom').empty();

        for(i = 0; i < 9; i++) {
            if(membership.toString()[i] == '_') {
                digit = '&nbsp;';
            } else {
                digit = membership.toString()[i];
            }

            $('ul#indexSiteCounterBottom').append('<li>'+digit+'</li>');
            $('ul#indexSiteCounterBottom li:nth-child(3n)').addClass('extra-margin');
        }

        // Execute again if needed
        if(oldMembership++ <= newMembership) {execute_if_membership();}
        else{ /* what to do else? maybe call another function */ }
    },500);
}

// execute by the first time
if(oldMembership++ <= newMembership) {execute_if_membership();}

 

编辑:使用此代码,您可以第一次调用该函数。函数等待 500 毫秒并执行,在函数的最后,它检查是否需要调用另一个时间(循环),如果需要,它会再次执行。后面如果要执行一些代码,需要把它放在condition的ELSE里面,因为如果下面再放一个代码,它会不等待就执行。那是因为setTimeoutandsetInterval使代码异步并继续执行代码。

于 2013-02-08T04:42:47.340 回答