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



我是javaScript和承诺的新手,我有一个要求我需要一次(我有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);
}

但是我得到了状态1然后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 the status2 then 2 status3等.....任何帮助都将受到赞赏。

您可以收集数组中的所有承诺,然后使用Promise.All on then获得一系列结果:

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

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

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

但是,您会混淆看到输出以序列打印(或看起来像序列(,但是这是正常的,无论是并行还是同步,输出(因为它被编码为编码,都将是一个接一个地打印的,也许不在相同的订单(。

如果您想在完成后立即输出全部输出,请按以下内容进行STH:

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

最新更新