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'のループごとに以下のコードの実行を約500ms遅くできるようにしたいと思います。

setIntervalとsetTimeoutを入れようとしましたが、これまで使用したことがなく、「if」条件ですべてのループが即座に完了しました。

これにsetIntervalまたはSetTimeoutを追加して、各'if'ループが500ms遅延するようにするにはどうすればよいですか?'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);

500msが経過する前に通話をキャンセルしたい場合は、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 ミリ秒待機して実行します。関数の最後で、もう一度呼び出す必要があるかどうかを確認し (ループ)、必要に応じて再度実行します。その後に何かコードを実行したい場合は、条件の ELSE の中に入れる必要があります。下に別のコードを入れると、待たずに実行されるからです。これは、 setTimeoutandsetIntervalがコードを非同期にし、コードの実行を継続するためです。

于 2013-02-08T04:42:47.340 に答える