【问题标题】:setTimeout inside forloop? JS NODEJS循环里面的setTimeout? JS 节点 JS
【发布时间】:2016-01-29 10:16:34
【问题描述】:

我试图在每个循环之间创建一个延迟。但是,在触发循环之前,我总是以延迟结束。我这样做的方式如下:

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

【问题讨论】:

    标签: node.js for-loop delay settimeout


    【解决方案1】:

    您的主循环正在连续执行setTimeout 函数。由于此函数的 async 特性,您将期望看到函数在它们之间没有延迟地执行。

    如果你想要近似的效果,你可以使用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);
    }
    

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

    编辑

    您可能想为此做更多的实验,因为我不是专家,知道setInterval 是如何设计为在 JS 中工作的,因为它本质上不是多线程?起点将考虑来自此SO的以下引用

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

    【讨论】:

    • 对,那是另一种方式,我知道这一点。然而它需要更多的代码,我很好奇为什么这不能像我预期的那样工作,因为在不同的编程语言中我从来没有遇到过类似的问题。谢谢你的解释!
    • 我也不是一个完整的 JS 人。干杯:)
    【解决方案2】:

    你可以这样做:

     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/

    【讨论】:

    • 它有点工作,但是它在最后一个整数上循环,它无法到达'items'变量的内容。
    • 这正是我所需要的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-28
    • 2015-11-30
    • 2021-07-30
    • 1970-01-01
    • 2016-06-25
    • 2020-04-01
    • 2018-08-02
    相关资源
    最近更新 更多