Javascript выводит все статусы за раз, используя модуль узла запроса - PullRequest
0 голосов
/ 06 мая 2019

Я новичок в javascript и обещаниях, у меня было требование, где мне нужно получить статус http моих URL (у меня есть 10 URL) одновременно (не последовательно). Поэтому я написал ниже код.

var request = require('request');

var fun = function(i) {
  request('http://myapp' + i + '.com', function(error, response, body) {
    console.log(response && response.statusCode, i);
  });
};

for (i = 0; i < 10; i++) {
  fun(i);
}

но я получаю status1, затем status2, затем status3 и т. д. ..... мое требование - распечатать все статусы за один раз.

тогда попробовал ниже код

var request = require('request');

var fun = function(myapp) {
  return new Promise(function(resolve, reject) {
    request('http://' + myapp + '.com', function(error, response, body) {
      resolve(response && response.statusCode);
    });
  });
};

for (i = 0; i < 10; i++) {
  fun('myapp' + i).then(function(val1) {
    console.log(val1);
  });
}

но все же, я получаю статус1, затем статус2, затем статус3 и так далее ..... Любая помощь приветствуется.

Ответы [ 2 ]

2 голосов
/ 06 мая 2019

Вы можете собрать все обещания в массив, а затем использовать Promise.all для получения массива результатов:

  const promises = [];

  for (i = 0; i < 10; i++) {
    promises.push( fun('myapp' + i));


  Promise.all(promises)
    .then(console.log, console.error);
0 голосов
/ 06 мая 2019

Ваш код правильный.Он выполняется асинхронно параллельно.

Однако вы не уверены, что вывод выводится в последовательности (или выглядит как последовательность), но это нормально, независимо от того, параллельный или синхронный, вывод (как он закодирован, будетпечатается один за другим, возможно, не в том же порядке).

, если вы хотите вывести все сразу, когда закончите, выполните что-то вроде следующего:

var request = require('request');
var finished = new Array(10);
var numFinished = 0;

var fun = function(i) {
  request('http://myapp' + i + '.com', function(error, response, body) {
    finished[i] = response && response.statusCode ? response.statusCode : 'No response';
    numFinished++;
  });
};

for (i = 0; i < 10; i++) {
  fun(i);
}

var timer = setTinterval(function(){
   if ( 10 <= numFinished )
   {
      clearInterval(timer);
      console.log(finished.join(',')); // print all at once
   }
}, 500);

Или если вы используете обещанияВы можете сделать:

var request = require('request');

var fun = function(myapp) {
  return new Promise(function(resolve, reject) {
    request('http://' + myapp + '.com', function(error, response, body) {
       resolve(response && response.statusCode ? response.statusCode : 'No response');
    });
  });
};

var promises = new Array(10);

for (i = 0; i < 10; i++) {
    promises[i] = fun('myapp' + i);

Promise.all(promises).then(function(results){
   console.log(results.join(',')); // print all at once
});
...