NodeJS HTTP请求未按顺序执行
Posted
技术标签:
【中文标题】NodeJS HTTP请求未按顺序执行【英文标题】:NodeJS HTTP Requests not executing in order 【发布时间】:2016-04-08 08:18:48 【问题描述】:第一次发帖,感谢大家提供的所有信息!
关于这个问题。我有一些代码尝试遍历 JSON 文件并在数组中的每个对象上执行 HTTP Get 请求。问题似乎出现在我执行 http get 请求时,它没有按顺序执行,也没有完成。在对我的 API 进行大约 6-9 次调用后,它就挂断了。
示例 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 调用执行的函数的副本。我有一个回调集,但我认为我可能没有正确设置它:
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
任何你认为我可以在代码中改进的地方都很棒......仍然每天都在 Node 上学习!
【问题讨论】:
挂断是什么意思? 代码将执行,然后在我的控制台日志上的最后一次迭代中停止。在 WebStorm IDE 中运行时,我可以看到脚本正在运行,但输出在最后一个“完成”标记后停止。 ***.com/questions/19739945/…可能重复 我确实看过使用地图功能。仍然没有解释为什么循环停止。使用 Async.map 或 Async.series 会运行所有这些并返回值/日志吗?没有完成迭代,这有点让人头疼。callback()
仅针对 200 状态代码调用。你应该写else
逻辑。响应中可能会出现其他一些状态。
【参考方案1】:
根据 Anand S,看起来非 200 人会吊死你。更改此代码:
console.log(isoTime + " " +pointname + " " + slotvalue);
callback()
进入这个:
console.log(isoTime + " " +pointname + " " + slotvalue);
callback()
你应该停止悬挂。
至于乱序,request.get()
调用仅将请求排队,它实际上并没有发出请求。这必须等待事件循环再次启动,直到调用函数返回才会发生。到那时,可能还有另一个 request.get()
也排队等候,可能会在它前面偷偷摸摸(或者更准确地说,可能会在前一个之前调用它的回调)。
我通常通过每个回调将写入的数组(具有唯一索引)来处理订单问题。虽然效率较低,但您也可以使用async
系列类型的函数来订购请求。
【讨论】:
感谢您的意见。选择这个作为答案,因为它有帮助。真正的罪魁祸首是功率不足的 333mhz 现场控制器。折叠我的 API 以在一个请求中提供所有信息,而不是通过多次调用 API 来完成。以上是关于NodeJS HTTP请求未按顺序执行的主要内容,如果未能解决你的问题,请参考以下文章
从 .Net 应用程序到 AWS API Gateway 的 HTTP POST 请求未按预期工作