2016-05-10 7 views
0

NodeJSサーバーにAPI呼び出しを送信しようとしています。残念ながら、サーバー(私によって作られたものではない)は私に非同期呼び出しをさせません。前のリクエストが完了するまでリクエストを待つ方法はありますか?

私は前回のリクエストが完了するのを待ってから送信する方法を見つけようとしています。ここで

は私のコードです:

var http = require('http'); 
var fs = require('fs'); 

// An object of options to indicate where to post to 
var post_options = { 
    host: 'localhost', 
    port: '8080', 
    path: '/api/scan', 
    method: 'POST', 
    headers: { 
     'Content-Type': 'application/json' 
    } 
}; 
var array = ["ssl.com", "google.com", "hamzakhan.org"]; 
for (var i=0; i<array.length;i++) { 
    //console.log(array[i]); 
    var post_req = http.request(post_options, function(res) { 
     res.setEncoding('utf8'); 
     var body = ''; 
     res.on('data', function(chunk) { 
      body += chunk; 
     }); 
     res.on('end', function() { 
      body = JSON.parse(body); 
      // Make sure it's working 
      console.log(body.response.subject); 
     }); 
    }); 

    var url = array[i]; 
    var catURL = { "url": url, "path": "/", "port": "443", "live_scan": "false", "advanced": "true" }; 
    post_req.write(JSON.stringify(catURL), function(err) { 
     //console.log(err); 
     post_req.end(); 
    }); 

} 

私は、forループの内部ループしながら、私ができるの巣aを考えていた、とwhileループはforループを続けることができたときに決まります旗を持っているでしょう。

このコードは、urlの値を単一のURLとしてハードコードするときに機能します。したがって、送受信に成功したことがわかります。

ありがとうございました!

+0

'array'変数をループするのではなく、たとえば、最初の要素から開始し、' res.on( 'end'、function(){...の中にコールバックを入れることができます/ * callback here */...}) 'あなたのプログラムに、応答が終了するたびに新しい要求を開始するように指示します。どう思いますか? – focorner

+0

新しいリクエストを開始するにはどうすればよいですか? – hamza765

+0

以下のコードに基づいて例をご覧ください。私はその例をテストしなかったことに注意してください。私は単に私の提案を説明するためにいくつかの行を追加しました。 – focorner

答えて

0
/** 
* Disclaimer: I did not test your code. I simply added a few 
* lines to illustrate my suggestion. 
*/ 

var http = require('http'); 
var fs = require('fs'); 
var EventEmitter = require('events').EventEmitter; 

// An object of options to indicate where to post to 

var post_options = { 
    host: 'localhost', 
    port: '8080', 
    path: '/api/scan', 
    method: 'POST', 
    headers: { 
     'Content-Type': 'application/json' 
    } 
}; 

var array = ["ssl.com", "google.com", "hamzakhan.org"]; 
var emitter = new EventEmitter(); 
var counter = 0, n = array.length; 

function PostRequest() { 
    var post_req = http.request(post_options, function(res) { 
     res.setEncoding('utf8'); 
     var body = ''; 
     res.on('data', function(chunk) { 
      body += chunk; 
     }); 
     res.on('end', function() { 
      body = JSON.parse(body); 
      // Make sure it's working 
      console.log(body.response.subject); 

      // ADD THE CALLBACK 
      // OR 
      // TRIGGER EVENT 
      return emitter.emit('ResponseEnded'); 

     }); 
    }); 

    var url = array[counter]; 
    var catURL = { "url": url, "path": "/", "port": "443", "live_scan": "false", "advanced": "true" }; 
    post_req.write(JSON.stringify(catURL), function(err) { 
     //console.log(err); 
     post_req.end(); 
    }); 
} 

emitter.on('ResponseEnded',function() { 
    ++counter; 
    if (counter < n) { 
     PostRequest(); 
    } 
    else { 
     console.log('Nothing more request'); 
    } 
}); 

// Start with the first request 
PostRequest(); 

更新:これは同じことを行う別の方法です。

/** 
* Disclaimer: I did not test your code. I simply added a few 
* lines to illustrate my suggestion. 
*/ 

var http = require('http'); 
var fs = require('fs'); 


// An object of options to indicate where to post to 

var post_options = { 
    host: 'localhost', 
    port: '8080', 
    path: '/api/scan', 
    method: 'POST', 
    headers: { 
     'Content-Type': 'application/json' 
    } 
}; 

var array = ["ssl.com", "google.com", "hamzakhan.org"]; 
var counter = 0, n = array.length; 

function PostRequest() { 
    var post_req = http.request(post_options, function(res) { 
     res.setEncoding('utf8'); 
     var body = ''; 
     res.on('data', function(chunk) { 
      body += chunk; 
     }); 
     res.on('end', function() { 
      body = JSON.parse(body); 
      // Make sure it's working 
      console.log(body.response.subject); 

      // THIS IS ANOTHER WAY OF DOING IT 
      ++counter; 
      if (counter < n) { 
       /** 
       * This is were your start new 
       * requests 
       */ 
       PostRequest(); 
      } 
      else { 
       console.log('Nothing more request'); 
      }    

     }); 
    }); 

    var url = array[counter]; 
    var catURL = { "url": url, "path": "/", "port": "443", "live_scan": "false", "advanced": "true" }; 
    post_req.write(JSON.stringify(catURL), function(err) { 
     //console.log(err); 
     post_req.end(); 
    }); 
} 

// Start with the first request 
PostRequest(); 
+0

この場合、私のコールバックとは何ですか?申し訳ありません、私はこれでかなり新しいです。 – hamza765

+0

コールバックは、タスクが完了すると呼び出す関数です。この場合、イベントエミッタを使用して、別のリクエストを送信する前に応答が終了するのを待っていることを明確にしました。リクエストが終了すると、「ResponseEnded」というイベントが発生し、そのイベントのイベントリスナーが下部に表示されます。 – focorner

+0

心配しないでください。出来た。何らかの理由で私は何とか 'counter n 'に切り替えました – hamza765

関連する問題