2016-01-04 8 views
5

Primo post ma grazie a tutti per tutte le informazioni!NodeJS HTTP Richieste non eseguite in ordine

On the issue. Ho un codice in cui sto cercando di ripetere su un file JSON ed eseguire una richiesta di ottenere HTTP su ogni oggetto nell'array. Il problema sembra sorgere in quanto quando eseguo la richiesta HTTP get non lo fa in ordine né lo completa. Riattacca dopo circa 6-9 chiamate contro la mia API.

JSON Esempio:

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

scorrere il 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")}) 
    } 


} 

Copia della funzione sto eseguendo su ogni ciclo per la chiamata API. Ho una funzione di callback set, ma non credo che io possa avere impostare questo correttamente:

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



     } 
    }); 



} 

campione del mio log della console dove si riaggancia:

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 

Tutto ciò che si pensi che io possa migliorare nel codice che sarebbe bello .. Ancora imparando ogni giorno su Node!

+1

Cosa intendi per riagganciare? –

+0

Il codice verrà eseguito e quindi si interromperà sull'ultima iterazione sul log della mia console. Riesco a vedere durante l'esecuzione in WebStorm IDE che lo script è in esecuzione ma l'output si interrompe dopo l'ultimo contrassegno "Fatto". –

+2

possibile duplicazione di http://stackoverflow.com/questions/19739945/node-http-requests-are-executing-out-of-order-causing-problems-with-an-api-using –

risposta

1

Per Anand S, sembra che i non-200 ti impicceranno. Modificare questo codice:

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

in questo:

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

e si dovrebbe smettere di impiccagione.

Come per out-of-order, la chiamata request.get() accoda solo una richiesta, in realtà non effettua la richiesta. Ciò deve attendere il riavvio del ciclo degli eventi, che non si verificherà fino a quando la funzione chiamante non ritorna. A quel punto, potrebbe esserci anche un altro request.get() accodato che potrebbe intrufolarsi (o, più precisamente, richiamare la sua richiamata prima di quella precedente).

Di solito gestisco i problemi degli ordini disponendo di un array su cui ogni callback scriverà (con un indice univoco). Sebbene meno efficiente, è possibile utilizzare le funzioni di tipo async per ordinare le richieste.

+0

Grazie per l'input. Seleziona questa risposta come ha aiutato. Il vero colpevole è diventato un controller da campo da 333mhz sottodimensionato. Collapsed my API per servire tutte le informazioni in una richiesta invece di farlo con più chiamate all'API. –

+0

Felice di averlo risolto, e grazie per aver accettato. –