setTimeout节点v0.12在for循环中立即触发?

时间:2015-05-04 02:34:30

标签: javascript node.js

在我在本网站上看到的关于setTimeout的所有问题中,大多数人都在setTimeout声明中执行该方法。我不是这样做的。

代码:

var nums = [1,2,3,4,5,6,7,8,9];

for(var i=0; i < nums.length; i++){
  setTimeout(function(num){
    var url = getUrl(num);
    //query(url); // prints out query operation and data return
    console.log(num);
  }, 1000, nums[i]);
}

当运行命令启动应用程序时,无论我设置毫秒延迟的大小,查询都将执行数组中的所有项目。当打印到控制台运行此代码时,我得到相同的效果。我做错了吗?其他人可以复制这个吗?

我创建了一个运行setInterval来测试api限制的应用程序,它按预期工作。我想我可能会错过某些有关setTimeout和循环的节点的后端知识? setTimeout Docs

文档确实说它不会保证它将执行回调的时间,但我有120个项目,它将触发登录并立即触发它们。

1 个答案:

答案 0 :(得分:0)

因为那些函数setTimeoutsetInterval异步工作, 您必须在setTimeout / setInterval回调函数中调用下一个循环。

var _i = 0
var doQuery = setInterval(function(){
  if(_i == nums.length) clearInterval(doQuery);
  var url = getUrl(nums[_i]);
  query(url);
  _i++;
},1000);