2016-01-04 12 views
5

Pierwszy wpis, ale dziękuję wszystkim za wszystkie informacje!Żądania HTTP NodeJS nie są wykonywane w kolejności

Dalej problem. Mam pewien kod, w którym próbuję iterować nad plikiem JSON i wykonać żądanie HTTP Get Request na każdym obiekcie w tablicy. Wydaje się, że problem pojawia się w tym, że podczas wykonywania żądania HTTP get nie robi tego w kolejności ani nie jest kompletny. Rozłącza się po około 6-9 wywołaniach mojego API.

Próbka JSON:

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

Iteracja nad 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")}) 
    } 


} 

Kopia funkcją Mam nakaz na każdej pętli do wywołania API. Mam zwrotna ustawiona, ale nie sądzę, abym Ustawiono prawidłowo:

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



     } 
    }); 



} 

próbki mojego dziennika konsoli gdzie odkłada:

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 

Cokolwiek myślisz mogę poprawić w kodzie, który byłby świetny ... Wciąż uczę się codziennie na Node!

+1

Co masz na myśli zawieszenie? –

+0

Kod zostanie wykonany, a następnie zatrzyma się na ostatniej iteracji w moim dzienniku konsoli. Podczas działania w IDE programu WebStorm widzę, że skrypt działa, ale dane wyjściowe są zatrzymywane po ostatnim znaku "Gotowe". –

+2

możliwe powielanie http://stackoverflow.com/questions/19739945/node-http-requests-s-executing-out-of-order-cousing-problems-with-an-api-using –

Odpowiedz

1

Per Anand S, wygląda na to, że wieszą Cię osoby nie-200. Zmień ten kod:

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

w tym:

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

i należy przerwać powieszenie.

Jeśli chodzi o kolejność poza kolejnością, wywołanie request.get() powoduje tylko kolejkowanie żądań, ale nie jest to żądanie. To musi poczekać, aż pętla zdarzeń znowu się uruchomi, co nie nastąpi, dopóki funkcja wywołująca nie wróci. Do tego czasu może znajdować się kolejna stacja, która może przed nią skradać się (lub, dokładniej, może wywoływać wywołanie zwrotne poprzedniej).

Zwykle obsługuję problemy z zamówieniami, mając tablicę, do której każde wywołanie zwrotne zapisze (z unikalnym indeksem). Chociaż są mniej wydajne, można również użyć funkcji typu serii async do zamawiania żądań.

+0

Dzięki za wejście. Wybierz to jako odpowiedź, ponieważ pomogło. Prawdziwym winowajcą okazał się niedostatecznie wydajny kontroler terenowy 333 mhz. Zwinąłem mój interfejs API, aby podawać wszystkie informacje w jednym żądaniu, zamiast wykonywać je za pomocą wielu wywołań interfejsu API. –

+0

Cieszę się, że to rozwiązałeś i dziękuję za akceptację. –

Powiązane problemy