2016-05-10 2 views
0

Я пытаюсь отправить вызовы API на сервер NodeJS. К сожалению, сервер (который не был сделан мной) не позволит мне делать асинхронные вызовы.Как сделать запрос дождитесь завершения предыдущего запроса?

Я пытаюсь выяснить способ сделать каждый запрос ждать завершения предыдущего запроса перед отправкой.

Вот мой код:

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

} 

Я думал, что я мог вкладываете в то время как петля внутри для цикла, и цикл в то время как будет иметь флаг, который будет диктовать, когда цикл может продолжать идти.

Теперь этот код работает, когда я жестко указываю значение url как единый URL-адрес, поэтому я знаю, что мне удастся отправить и получить.

Благодарим за помощь/помощь!

+0

Вместо прохода через 'array' переменной, вы могли бы, например, начать с первого элемента, а затем положить обратный вызов внутри' res.on («конец», функция() {.../* callback здесь */...}) ', чтобы сообщить вашей программе, чтобы начать новый запрос каждый раз, когда заканчивается ответ, пока больше не будет отправлено запросов. Как вы думаете? – 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

Nevermind. Это сработало. По какой-то причине я как-то переключил 'counter n' – hamza765

Смежные вопросы