Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NodeJS HTTP Requests not executing in order

First post but thanks everyone for all the info!

On to the issue. I have some code in which I am trying to iterate over a JSON file and execute an HTTP Get Request on each object in the array. The issue seems to arise in that when I am executing the http get request that it does not do so in order nor does it complete. It hangs up after about 6-9 calls against my API.

Sample JSON:

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

Iterating over the 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")})
    }


}

Copy of the function I am executing on each loop for the API call. I have a callback set but I don't think I may have set this up properly:

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()



        }
    });



}

Sample of my console log where it hangs up:

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

Anything you think I can improve on in the code that would be great.. Still learning everyday on Node!

like image 452
Justin Scott Avatar asked Nov 09 '22 22:11

Justin Scott


1 Answers

Per Anand S, it looks like non-200's will hang you. Change this code:

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

into this:

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

and you should stop hanging.

As for out-of-order, the request.get() call only queues up a request, it doesn't actually make the request. That has to wait for the event loop to fire up again, which won't occur until the calling function returns. By that time, there could be another request.get() also queued that might sneak ahead of it (or, more precisely, may call its callback before the former one).

I usually handle order issues by having an array that each callback will write into (with a unique index). While less efficient, you can also use async series-type functions to order requests.

like image 122
Allen Luce Avatar answered Nov 14 '22 21:11

Allen Luce