Javascript使用请求节点模块一次打印所有状态

时间:2019-05-06 18:00:47

标签: javascript promise request-promise

我对javascript并不陌生,但是我有一个要求,我需要一次获取我的URL(我有10个URL)的http状态(不是连续的)。 所以我写了下面的代码。

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

但仍然,我得到的是status1,然后是status2,然后是status3,依此类推..... 任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:2)

您可以将所有的Promise收集到一个数组中,然后在Promise.all上使用Promise.all以获得结果数组:

  const promises = [];

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


  Promise.all(promises)
    .then(console.log, console.error);

答案 1 :(得分:0)

您的代码正确。它以并行方式异步执行。

但是,您很困惑地看到按顺序打印输出(或看起来像顺序的输出),但这是正常的,无论并行输出还是同步输出(编码后的输出都会一个接一个地打印,也许不会打印)相同顺序)。

如果要在完成后立即全部输出,请执行以下操作:

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