2016-01-04 12 views
5

最初の投稿だが、すべての情報に感謝する!NodeJS HTTPリクエストが順番に実行されない

問題が発生しました。 JSONファイルを繰り返し処理し、配列内の各オブジェクトに対してHTTP Get Requestを実行しようとしているコードがあります。この問題は、http get要求を実行しているときに順番に実行していない場合でも、完了していない場合に発生するようです。私のAPIに対して約6〜9回のコールの後にハングアップします。

サンプルJSON:JSONを超える

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

反復処理:私はAPI呼び出しの各ループ上で実行しています機能の

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


} 

コピー。私は、コールバックが設定されているが、私はこれを適切に設定しているかもしれないと思う。それがハングアップする私のコンソールログの

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で学んでいる!

+1

何が中断しているのですか? –

+0

コードは実行され、コンソールログの最後の反復で停止します。 WebStorm IDEでスクリプトを実行しているが、最後の「完了」マークの後に出力が停止しているのがわかります。 –

+2

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

答えて

1

Anandand Sによると、非200のように見えます。この中

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

:このコード変更

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

を、あなたがぶら下がって停止する必要があります。

アウトオブオーダーに関しては、request.get()コールは要求をキューに入れるだけで、実際には要求を出しません。それはイベントループが再び起動するのを待たなければなりません。呼び出し元の関数が戻るまでは発生しません。その時までに待っていたかもしれないもう一つのrequest.get()があるかもしれません(または、より正確には、前のコールバックを呼び出すかもしれません)。

私は通常、各コールバックが(一意のインデックスで)書き込む配列を持つことによって注文の問題を処理します。あまり効率が悪い間に、asyncシリーズ型関数を使用してリクエストを注文することもできます。

+0

ありがとうございました。これが助けになったので答えとして選択してください。実際の犯人は、333mhzのフィールドコントローラの下限に達しました。私のAPIを折りたたんで、APIへの複数の呼び出しで行うのではなく、1つの要求ですべての情報を提供します。 –

+0

うれしいことにあなたはそれを解決し、受け入れてくれてありがとう。 –

関連する問題