NodeJS HTTP请求不按顺序执行

首先,但感谢大家的所有信息!

在这个问题上。 我有一些代码,我试图遍历一个JSON文件,并执行数组中的每个对象的HTTP获取请求。 这个问题似乎出现在我正在执行http get请求时,它不这样做,也没有完成。 它大约6-9对我的API调用后挂断。

示例JSON:

[ { "Name": "ActClgStpt", "Address": 326, "Slot": 1 }, { "Name": "ActHtgStpt", "Address": 324, "Slot": 1 }, { "Name": "AdvanceCool", "Address": 21, "Slot": 1 } ] 

迭代JSON:

  sedona.jsonInputAddress('Unit1GWRenton', logMe); function logMe() { for(var i in config) { var name = config[i].Name; var address = config[i].Address; var slot = config[i].Slot; console.log(name + " " + address + " " + slot); sedona.collectValues("192.168.101.14", 2001, config[i].Name, config[i].Address, config[i].Slot,function(){console.log("Done")}) } } 

我正在API调用的每个循环执行函数的副本。 我有一个callback集,但我不认为我可能已经设置好了:

 collectValues:function(site,port,name,address,slot,callback){ /* Build Scrape Constructor */ var url = 'http://' + (site) + ':' + (port) + '/twave/app/' + (address); /* Slice out Unit # */ unitNumber = port.toString().slice(2, 4); /* Create slotid */ var slotmaker = "slot" + (slot); /* Get ISO Timestamp */ var dt = new Date(); var isoDate = dt.toISOString(); isoTime = isoDate.slice(0,19).replace('T', ' ').concat('.000000+00:00'); /* Make API Call */ request.get({ agent: false, url: url, json: true }, function response (error, response, body) { if (!error && response.statusCode === 200) { // Grab Point Name pointname = name; // Grab Point Value var value = body.slots; var slot = value[slotmaker]; slotvalue = slot.value; // Testing Logs console.log(isoTime + " " +pointname + " " + slotvalue); callback() } }); } 

我的控制台日志样例挂起:

 ActClgStpt 326 1 ActHtgStpt 324 1 AdvanceCool 21 1 AdvanceDewEnable 462 1 CO2Sensor 455 1 CO2Stpt 257 1 CTRange 14 6 ComfortStatus 328 1 CompAllow 167 1 Cool1Spd 83 1 Cool2Spd 84 1 CoolCall1 314 2 CoolCall2 315 2 CoolCmd1 109 1 CoolCmd2 110 1 DCVMaxVolume 260 2 DCVResponse 502 2 SaTemp 423 1 DaTempLimit 193 2 Damper 387 1 DriveFaultCode 123 4 ESMEconMin 175 1 ESMMode 8 1 EconDewEnable 464 1 EconMode 96 1 EconTest 496 1 FanCall 78 1 FanPower 491 1 FanSpeed 492 1 FanStatus 135 1 FullSpd 38 1 Heat1Spd 31 1 Heat2Spd 32 1 HeatCall1 316 2 HeatCall2 317 2 HeatCmd1 69 1 HeatCmd2 70 1 HighAlarmStpt 62 1 HighAlertStpt 61 1 LowAlarmStpt 59 1 LowAlertStpt 58 1 OSAVolume 493 1 OaTemp 457 1 OccClgStpt 247 1 OccHtgStpt 246 1 Occupied 313 1 OptimumStartCommand 233 1 OverrideTime 348 1 PBStatus 221 1 PowerExCmd 107 1 PowerExStpt 188 1 RaTemp 456 1 ResetDrive 212 1 ServiceSwitch 361 5 SoftSwitch 310 4 SpaceTemp 490 1 StdEconMin 176 1 StdEconStpt 307 1 StptAdj 291 1 StptAdjRange 269 1 UnitAmps 454 1 UnitHealth 276 2 UnoccClgStpt 268 1 UnoccHtgStpt 258 1 VentMode 400 2 VentSpd 30 1 2016-01-04 16:40:15.000000+00:00 ActClgStpt 73.000000 Done 2016-01-04 16:40:15.000000+00:00 UnitAmps 5.406000 Done 2016-01-04 16:40:15.000000+00:00 CoolCmd2 false Done 2016-01-04 16:40:15.000000+00:00 ActHtgStpt 68.000000 Done 

任何你认为我可以改进的代码,将是伟大的..仍然在节点上学习!

每个Anand S,它看起来像非200会挂你。 更改此代码:

  console.log(isoTime + " " +pointname + " " + slotvalue); callback() } 

进入这个:

  console.log(isoTime + " " +pointname + " " + slotvalue); } callback() 

你应该停止挂。

至于乱序, request.get()调用只是排队请求,它实际上并不提出请求。 必须等待事件循环再次启动,直到调用函数返回才会发生。 到那个时候,可能会有另一个request.get()也排队,可能会在它前面潜行(或者更确切地说,可能会在前一个之前调用它的callback函数)。

我通常通过将每个callback写入(具有唯一索引)的数组来处理订单问题。 虽然效率较低,但您也可以使用async系列types函数来订购请求。