forloop里面的setTimeout? JS NODEJS

时间:2016-01-29 10:16:34

标签: node.js for-loop delay settimeout

我正在尝试在每个循环之间创建延迟。然而,我总是在循环被触发之前只有延迟结束。我这样做的方式如下:

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

2 个答案:

答案 0 :(得分:2)

您的主循环正在连续执行setTimeout个功能。由于此函数的 async 特性,您可能会看到正在执行的函数之间没有延迟。

如果你想要近似效果,当函数的执行时间小于延迟时间时,你可以使用setInterval。这将与Adam的anwer相同。

但是对于确切的“在每个循环之间创建延迟”,您将需要一些回调。

首先想到的是:

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。

答案 1 :(得分:1)

你可以这样做:

ID

或者也可以将 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']

我建议你阅读:http://javascriptissexy.com/understand-javascript-closures-with-ease/