2016-01-04 27 views
5

Sırasıyla yürütme talepleri İlk gönderi ancak tüm bilgiler için herkese teşekkürler!NodeJS HTTP

Sorun hakkında. Bir JSON dosyası üzerinde yinelemeye çalıştığım ve dizideki her nesnede bir HTTP Get Request çalıştıracağım bazı kodum var. Sorun, http alma isteğini yürütürken, bunu ne zaman gerçekleştirmediği ne de tamamlanmadığında ortaya çıkmaktadır. API'mma karşı yaklaşık 6-9 çağrı yapıldıktan sonra kilitleniyor.

Numune JSON: JSON üzerinde

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

yineleme: Ben API çağrısı için her döngü yürütme am fonksiyonun

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


} 

kopyası. Bir geri arama ayarlamış ama ben düzgün şekilde ayarladınız olabilir sanmıyorum: Bu kapatırsa benim konsol günlüğünün

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



     } 
    }); 



} 

Örnek: Eğer ben artırabilir düşünüyorum

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 

şey kod harika olurdu .. Hala her gün Düğümde öğrenme!

+1

Neyi kastediyorsunuz? –

+0

Kod yürütülür ve daha sonra konsol günlüğümde son yinelemede durur. WebStorm IDE'de çalışırken betiğin çalıştığını ancak çıkışın son "Tamamlandı" işaretinden sonra durduğunu görebiliyorum. –

+2

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

cevap

1

Anand S'ye göre, 200'li olmayanlar sizi asacak gibi görünüyor. Bu içine

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

: Bu kodu değiştirin

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

ve asılı durmak gerekir.

Sipariş dışı ise, request.get() numaralı çağrı yalnızca istekte bulunur, istekte bulunmaz. Bu, olay döngüsünün tekrar tetiklenmesini beklemek zorundadır; bu, arama işlevi geri gelene kadar gerçekleşmez. Bu süre zarfında, önceden gizlenmiş olabilecek başka bir request.get() adresi de olabilir (veya daha doğrusu, eskiden önceki geri dönüşünü çağırabilir).

Genellikle, her bir geri bildirimin yazacağı bir diziye (benzersiz bir dizine sahip) sahip olacak şekilde düzen sorunlarını ele alıyorum. Daha az verimli olsa da, istekleri göndermek için async serisi tipi işlevleri de kullanabilirsiniz.

+0

Giriş için teşekkürler. Yardım ettiği gibi bunu bir cevap olarak seçin. Gerçek suçlu, yetersiz bir 333mhz alan denetleyicisi olmaktan çıktı. API'ye birden çok çağrı yapmak yerine, tek bir istekte tüm bilgileri sunmak için API'mı daraltdım. –

+0

Bunu çözdüğüne ve kabul ettiğiniz için teşekkürler. –