使用async.js顺序执行多个HTTP请求

时间:2017-06-01 17:59:30

标签: javascript node.js callback async.js

如何使用async.js顺序执行多个HTTP请求。我检查了async.js文档,但无法弄清楚,该怎么做。我想使用async.js回调样式实现与下面代码相同的东西。

var http = require('http');
var Q = require('q');
var URL="http://localhost:3000";

var getPromise=function(url) {  
  var deferred  = Q.defer();
  var req = http.get(url, function(response) {
    if(response.statusCode < 200 || response.statusCode > 299){
            deferred.reject(new Error('ErrorCode '+response.statusCode))
        }   
      var result="";
        response.on('data',function(chunk){result +=chunk;} )
        response.on('end',function(){deferred.resolve(result);} ) 
  });

  req.on('error',function(err){
      console.error('Error with the request:', err.message); 
      deferred.reject(err); 
  });

  req.end();  
  return deferred.promise;
} 


getPromise('http://localhost:3000/olympic/2016/ranking/4')
      .then(function(data){
         console.log("Response 1 "+data)
         return getPromise(URL+'/iso/country/'+JSON.parse(data).Country);
      })
      .then(function(data){
         console.log("Response 2 "+data)
         return getPromise(URL+'/olympic/2016/medal/'+JSON.parse(data).iso);
      })
      .then(function(data){
        console.log("Response 3 "+data)
      })
      .catch(function(err){
         console.log(err)
      });

3 个答案:

答案 0 :(得分:0)

async.js中有系列功能

https://caolan.github.io/async/docs.html#series

tldr; RTFM

答案 1 :(得分:0)

稍微查看代码并尝试更多地了解它,我相信async.waterfall是您需要的功能。这将做的是按顺序运行每个函数,将其结果传递给序列中的下一个函数。这是一个例子:

async.waterfall([
    function(callback)
    {
        // Function 1: do request here...
        callback(null, val); // replace null with a value if you want the waterfall to error and go straight to the end
    },
    function(val, callback) {
        // Function 2: do your second request here
        callback(null, val1, val2, val3); // you can pass any number of variables you like, just make sure the next function in the sequence expects them
    },
    function(val1, val2, val3, callback)
    {
        // Function 3: do your third request here
        callback(null, result);
    } // this can go on for as long as you like
], function(err, result)
{
    // this will be called immediately if the first parameter in any of the callbacks is not null, or when all the functions have run
});

答案 2 :(得分:0)

我知道了,我需要async.waterfall它需要一系列函数并逐个执行它们。我们也可以将先前函数执行的结果传递给下一个函数

var async =  require('async');

async.waterfall([

  function task1(done) {
    console.log('start!');
    setTimeout(function(){
        console.log("T1 Complete"); 
        // <- set value to passed to step 2
        done(null, 'Value from step 1'); 
     },5000);

  },
  function task2(task1Result, done) {
    console.log(task1Result);
    setTimeout(function(){
        console.log("T2 Complete");
        // <- set value to passed to step 3
        done(null, 'Value from step 2');
      },1000);

  },
  function task3 (task2Result, done) {
    console.log(task2Result);
    setTimeout(function(){
        console.log("T3 Complete"); 
        // <- no value set for the next step.
        done(null); 
    },100);

  }
],
function (err) {
  if (err) {
    throw new Error(err);
  } else {
    console.log('No error happened in any steps, operation done!');
  }
});