2

この js は値を取り、そこから X の量を減算し、その値までカウントアップします。

単純な while ループを実行してこのタスクを実行しようとしましたが、うまくいきませんでした。

以下のwhileループメソッドが機能しない方法または理由について誰かがコメントできるかどうか疑問に思っていました。

これが私がそれを機能させる唯一の方法です:

function _initCountUpUsers()
{
    var totalUsers = $('#totalUsers');
    var ceiling = parseInt(totalUsers.html());
    var floor = ceiling - 10;

    function updateTotalUsers()
    {
        if(floor < ceiling)
        {
            totalUsers.html(floor);
            floor++;
        }
    }

    window.setInterval(updateTotalUsers, 1000, floor);
}

非稼働Whileメソッド:

function _initCountUpUsers()
{
    var totalUsers = $('#totalUsers');
    var ceiling = parseInt(totalUsers.html());
    var floor = ceiling - 10;

    function updateTotalUsers()
    {
        totalUsers.html(floor);
        floor++;
    }

    while(floor < ceiling)
    {
         window.setInterval(updateTotalUsers, 1000, floor);       
    }

}
4

2 に答える 2

3

最初の方法に固執したくない理由はわかりませんが...

while(floor < ceiling)
{
     window.setInterval(updateTotalUsers, 1000, floor);       
}

これにより、10 個の個別のタイマーが開始され、それぞれが 1 秒に 1 回起動するように設定され、それぞれがフロアをインクリメントしてtotalUsersを更新するように設定され、終了することはありません。それらが発砲した場合、最初の例では 1 ずつカウントされるのに対し、毎秒 10 ずつカウントが増加することがわかります。ただし、床が天井に達するのを待って永遠にループするため、実際にはどれも発火しません!

JavaScript はシングルスレッドです。スクリプトの実行中、イベント (タイマーを含む) はキューに入れられます。したがって、whileループを更新するタイマー イベントは実行が終了するまで待機するため、ループが終了することはありません。

そうでない場合でも、10 個のタイマーがそれぞれ永久に実行されます。

最初の方法で正しい軌道に乗っていました。タイマーを停止するだけです。

function _initCountUpUsers()
{
    var totalUsers = $('#totalUsers');
    var ceiling = parseInt(totalUsers.html());
    var floor = ceiling - 10;

    function updateTotalUsers()
    {
        if(floor < ceiling)
        {
            totalUsers.html(floor);
            floor++;
        }
        else
        {
          window.clearInterval(timerID); // stop firing the timer once per second
        }
    }

    var timerID = window.setInterval(updateTotalUsers, 1000, floor);
}

これを書くための少しクリーンでエラーの少ない方法を探しているなら、ちょっとしたヘルパールーチンを自分でコーディングしてください:

function while_interval(proc, int)
{
  var timerID = setInterval(function()
  {
    if ( !proc() ) clearInterval(timerID);
  }, int);
}

...そしてそれを次のように呼び出します:

while_interval(function()
{
  if (floor < ceiling)
  {
    totalUsers.html(floor);
    floor++;
    return true;
  }
}, 1000);

これにより、ほんの少しのハウスキーピング コードを抽象化できますが、さらに重要なことtrueは、間隔ループを実行し続けたい限り、意識的に戻る必要があることです。

于 2010-08-02T18:09:28.683 に答える
-1
function _initCountUpUsers()
{
    var totalUsers = $('#totalUsers'),
        ceiling = parseInt(totalUsers.html()),
        floor = cieling - 10,
        intRef = null;

    function updateTotalUsers()
    {
        if(floor < ceiling)
        {
            totalUsers.html(floor);
            floor++;
        }
        else {
            window.clearInterval(intRef);
        }
    }

    intRef = window.setInterval(updateTotalUsers, 1000);
}

また

function _initCountUpUsers()
{
    var totalUsers = $('#totalUsers');
    var ceiling = parseInt(totalUsers.html());
    var floor = cieling - 10;
    var int;

    function updateTotalUsers()
    {
        if(floor < ceiling)
        {
            totalUsers.html(floor);
            floor++;
            window.setTimeout(updateTotalUsers, 1000);
        }
    }

    window.setTimeout(updateTotalUsers, 1000);
}
于 2010-08-02T18:07:42.010 に答える