代码之家  ›  专栏  ›  技术社区  ›  Patryk Cieszkowski

在forloop中设置超时?JS节点

  •  0
  • Patryk Cieszkowski  · 技术社区  · 9 年前

    我试图在每个循环之间创建一个延迟。然而,在循环被触发之前,我总是以延迟结束。我的做法如下:

        for (var i = 0; i < items.length; i++)
        {
          setTimeout(function()
          {
            console.log(i + ". " + items[i]['name']);
            priceManagement.FindPrices(items[i]['name']);
          }, 3000);
        }
    
    2 回复  |  直到 9 年前
        1
  •  2
  •   Community CDub    7 年前

    主循环正在执行 setTimeout 连续工作。由于 异步 由于这个函数的性质,您将期望看到函数在它们之间没有延迟地执行。

    您可以使用 setInterval 如果您想要近似效果,当函数的执行时间为 小于延迟时间。这将实现亚当的答案。

    但为了准确地“在每个循环之间创建延迟”,您需要一些回调。

    首先要记住:

    function main() {
      doWork(items, 0, items.length);
    }
    
    function doWork(items, i, loopLength) {
      // The bit in the loop
      console.log(i + ". " + items[i]['name']);
      priceManagement.FindPrices(items[i]['name']);
      i++;
    
      if (i < loopLength) {
        delayDoWork(items, i, loopLength);
      }
      else {
        // Do rest in the main
        ...
      }
    }
    
    function delayDoWork(items, i, loopLength) {
      setTimeout(function(items, i, loopLength)
      {
        doWork(items, i, loopLength);
      }, 3000, items, i, loopLength);
    }
    

    这将保证循环之间的精确延迟。

    编辑

    你可能想为此做更多的实验,因为我不是一个专家,不知道如何 设置间隔 设计用于JS,因为它本质上不是多线程?起点将考虑以下报价 SO

    实际上,setTimeout()在执行队列的末尾重新排队新的JavaScript。

        2
  •  1
  •   Adam    9 年前

    您可以这样做:

     for (var i = 0; i < items.length; i++)
        {
          setTimeout(function(i)
          {
            console.log(i + ". " + items[i]['name']);
            priceManagement.FindPrices(items[i]['name']);
          }, 3000*i, i);
        }
    

    或者可以通过 items[i]['name'] 作为参数:

     for (var i = 0; i < items.length; i++)
        {
          setTimeout(function(i, name)
          {
            console.log(i + ". " + name);
            priceManagement.FindPrices(name);
          }, 3000*i, i, items[i]['name']);
        }
    

    我建议您阅读以下内容: http://javascriptissexy.com/understand-javascript-closures-with-ease/