Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Meteor/Node.js:for循环中的多个http请求是否在一个时间间隔内均匀分布?_Javascript_Node.js_Asynchronous_Callback_Meteor - Fatal编程技术网

Javascript Meteor/Node.js:for循环中的多个http请求是否在一个时间间隔内均匀分布?

Javascript Meteor/Node.js:for循环中的多个http请求是否在一个时间间隔内均匀分布?,javascript,node.js,asynchronous,callback,meteor,Javascript,Node.js,Asynchronous,Callback,Meteor,亲爱的JS开发者们- 我正在尝试在Meteor应用程序中定时发出一批服务器端http请求,并根据收到的响应更新MongoDB数据库。每15秒,应开始一批请求,并且请求集应在15秒内均匀分布,而不是一次淹没API服务器。为了均匀分布请求,我尝试使用setTimeout方法 每个http请求之间有两个参数发生变化,这些变化的值存储在两个单独的数组中。如果您计算两个数组之间的所有组合(20*4=80),那么我没有详细说明每个http请求,而是在for循环中编写了一个for循环,以大大整合代码。对于每个

亲爱的JS开发者们-

我正在尝试在Meteor应用程序中定时发出一批服务器端http请求,并根据收到的响应更新MongoDB数据库。每15秒,应开始一批请求,并且请求集应在15秒内均匀分布,而不是一次淹没API服务器。为了均匀分布请求,我尝试使用setTimeout方法

每个http请求之间有两个参数发生变化,这些变化的值存储在两个单独的数组中。如果您计算两个数组之间的所有组合(20*4=80),那么我没有详细说明每个http请求,而是在for循环中编写了一个for循环,以大大整合代码。对于每个响应,如果返回OK,则两个switch语句通过计算响应的i和y值来处理响应

问题是:我好像在地狱里。当响应从服务器到达时,循环系统有时已经增加了i和/或y的值,因此我无法100%确定地使用switch语句处理响应。updatedb函数最终会对错误的响应执行某些计算,并将它们存储在数据库中错误的位置

希望有人能为我提供一些指导,告诉我我可以采取什么不同的方法来解决这个问题,因为我已经智穷了

另外,我尝试使用递归方法进行此操作,但得到了超出最大调用堆栈大小的错误


可以在调用后更新的元素上使用事件


例如,您可以查看第19行$'body'。在'requestscompleted'上,函数{…

可以在调用后更新的元素上使用事件

for (i=0;i<array1.length;i++)
例如,您可以查看第19行$'body'。在'requestscompleted'上,函数{

for (i=0;i<array1.length;i++)
代码中的第二个问题比较棘手,但幸运的是众所周知。请看以下代码:

var funs = [];

for(var y=0; y<10; ++y) {
  var print = function() {
    console.log(y);
  }
  funs.push(print);
}

for(var i=0; i<funs.length; ++i) {
  funs[i]();
}
当您运行代码时,您希望控制台打印什么?请考虑一下。然后查看:

您在该页面看到的第二个警告说明了一切:不要在循环中生成函数。发生的情况是,您在函数体中使用的变量y引用了作用域在for块之外的变量y,在调用您定义的每个函数时,该变量的作用域已经增加到10。因此console.logic始终解析到控制台。log10

经验法则:不要在循环中生成函数

代码中的第二个问题比较棘手,但幸运的是众所周知。请看以下代码:

var funs = [];

for(var y=0; y<10; ++y) {
  var print = function() {
    console.log(y);
  }
  funs.push(print);
}

for(var i=0; i<funs.length; ++i) {
  funs[i]();
}
当您运行代码时,您希望控制台打印什么?请考虑一下。然后查看:

您在该页面看到的第二个警告说明了一切:不要在循环中生成函数。发生的情况是,您在函数体中使用的变量y引用了作用域在for块之外的变量y,在调用您定义的每个函数时,该变量的作用域已经增加到10。因此console.logic始终解析到控制台。log10


经验法则:不要在循环中生成函数。

我的代码运行的是服务器端,因此没有DOM交互。你能澄清一下你的意思吗?我误解了你的问题。但我认为可以使用相同的方法。如果这个条件是:If request.statusCode==200 | | array1.indexOf[array1[I]]!=i | | array2.indexOf[array2[y]]!=y如果之前修改了值,您不会执行错误的语句。我的代码运行服务器端,因此没有DOM交互。请您澄清一下您的意思好吗?我误解了您的问题。但我认为可以使用相同的方法。如果此条件为:if request.statusCode==200 | | array1.indexOf[array1[i]!=i | | array2.indexOf[array2[y]]!=y如果之前修改了值,则不会执行错误的语句。迭代器i和y的作用域为它们不在for循环中的函数。按照说明操作迭代器i和y的作用域为它们不在for循环中的函数。按照说明操作感谢您的响应!我添加了var声明s并将函数和数组移出循环,但似乎仍然存在由i和y值引起的污染。这是一个控制台。我的循环仅针对i=0和y=0的logi++y++响应输出:>0 0 617.51>0 0 0 617.51>0 34.3>0 0 617.51>0 617.51>0 617.51。请注意,34.3值i>0响应分散在be中tween。关于为什么程序认为34.3值(对应于不同的i值)是i=0,有什么指导吗?我想出来了-很简单。我没有将响应传递给更新函数,所以HTTP请求延迟可能会导致它处理错误的响应。感谢关于将函数移出循环的提示!感谢您的resp
安塞!我添加了var声明,并将函数和数组移出了循环,但似乎仍然存在由I和y值引起的污染。这是一个控制台。我的循环仅针对i=0和y=0的logi++y++响应输出:>0617.51>0617.51>034.3>0617.51>0617.51>0617.51>0617.51。请注意,34.3值i>0响应分散在两者之间。关于为什么程序认为34.3的值,对应于一个不同的i值,是i=0,有什么指导吗?弄明白了-太简单了。我没有将响应传递给updates函数,因此HTTP请求延迟可能会导致它处理错误的响应。感谢您提供有关将函数移出循环的提示!