javascript - NodeJS HTTP请求未按顺序执行

标签 javascript json node.js loops http

第一次发帖,但感谢大家提供的所有信息!

关于这个问题。我有一些代码,我在其中尝试遍历 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 上学习!

最佳答案

根据 Anand S,看起来非 200 的人会绞死你。更改此代码:

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

进入这个:

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

而且你应该停止悬挂。

至于乱序,request.get() 调用只是排队一个请求,并没有真正发出请求。这必须等待事件循环再次启动,直到调用函数返回才会发生。到那时,可能还有另一个 request.get() 也在排队,可能会先于它(或者更准确地说,可能会在前一个之前调用它的回调)。

我通常通过拥有一个数组来处理订单问题,每个回调都将写入该数组(具有唯一索引)。虽然效率较低,但您也可以使用 async 系列类型的函数来对请求进行排序。

关于javascript - NodeJS HTTP请求未按顺序执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34595906/

相关文章:

javascript - 在单击提交按钮之前如何检查图像是否已生成?

json - 将大型集合对象(从json解析)写入excel范围

node.js - 回调不是函数 Node js

javascript - 有没有办法用 CasperJS 截取新遗物的仪表板屏幕截图?

javascript - 如何将 JQuery Contains 与 id 选择器一起使用

javascript - next.js 环境变量未定义(Next.js 10.0.5)

javascript - UTF-8:从 Ajax 客户端到 Tomcat 服务器的希伯来字符集

json - 如何使用按钮或拉动刷新来刷新 TableView 和 JSON 数据?

java - 解析 JSON 对象时 Gson 解析错误

node.js - 如何使用 Node JS 和 Mongodb 进行加载测试