如何在nodejs和request的同一文档中放入不同的请求响应?

时间:2016-03-08 20:06:23

标签: node.js http asynchronous get request

您好我想在同一份文件中提出不同的请求回复。我有这个文件:

var result = {google:"", twitter:"", facebook:""}

我想对这些网站(google.com,Facebook.com,twitter.com)做不同的GET请求,并将所有结果放在通讯字段中。 我尝试使用嵌套回调,但是这样我必须首先进行谷歌通话,然后是推特等,这样:

Request({
        url:first_url,
      },function(err, response, body) {
        if (err) {
             request.log(err);
        }else{
           risultato.google = body;
           Request({
        url:second_url,
      },function(err, response, body) {
        if (err) {
             request.log(err);
        }else{
           risultato.facebook = body;
           Request({
        url:third_url,
      },function(err, response, body) {
        if (err) {
             request.log(err);
        }else{
           risultato.twitter = body;
           console.log(result);
        }
       });
     }
   });
  }
 });

所以我必须知道如何并行执行所有请求,并且当我在结果对象中获得所有请求的响应时,我必须使用它。

2 个答案:

答案 0 :(得分:2)

您可以使用async

var async = require('async');
var request = require('request');

async.parallel({
  google: function(cb) {
    request("https://google.com", function(err, resp, data) {
      cb(err, data)
    })
  },
  facebook: function(cb) {
    request("https://facebook.com", function(err, resp, data) {
      cb(err, data)
    })
  },
  twitter: function(cb) {
    request("https://twitter.com", function(err, resp, data) {
      cb(err, data)
    })
  },
}, function(err, results) {
     console.log(err, results);
     //results is now equals to {google: "", facebook: "". twitter: ""}
});

答案 1 :(得分:2)

async的替代方法是使用Promise API。有一个request-promise npm库(https://www.npmjs.com/package/request-promise),它为每个请求返回一个Promise。我们可以发送每个URL的请求,然后只需在Promises列表中调用Promise.All:

const request = require('request-promise');
const urls = ['http://google.com', 'http://yelp.com'];

// List of Promises that resolve the original URL and the content
const resultPromises = urls.map(url => {
    return request(url).then(response => ({ url, response }));
});

Promise.all(resultPromises)
    .then(results => {
        // results is an array containing the URL and response for each URL
        console.log(results);
    });