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 个单独的计时器,每个计时器设置为每秒触发一次,每个计时器设置为增加floor并更新totalUsers,并且它们都不会终止。如果他们开火,您会看到计数每秒增加 10,而在第一个示例中增加 1。但是,它们都不会真正开火,因为您将永远循环等待地板到达天花板

JavaScript 是单线程的。事件(包括计时器)在脚本执行时排队。因此,您的while循环将永远不会终止,因为将更新它的计时器事件将等待触发,直到它完成执行!

即使不是这样,你仍然有十个计时器,每个计时器都永远运行。

您使用第一种方法走在正确的轨道上。您只需要停止计时器:

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 回答