簡體   English   中英

node.js:使http調用for循環

[英]node.js : make http calls in for loop

我想對數組中的每個元素進行http調用,並將所有響應組合到一個數組中,如下所示:

result = [] ; i = 0
for item in array
  options = get_options(item)
  request options, (err, res, body)->
    result[i++] = body

// when all calls are done, console.log the 'result' array

我正在查看異步模塊,但是我不確定如何使用它。

試試這個,應該可以。 您可能想嘗試mapLimit來限制並行請求的數量,或者嘗試限制mapSeries來按順序進行。

var async = require('async');
var request = require('request');
async.map(['url1', 'url2'], function(item, callback){
  request(item, function (error, response, body) {
    callback(error, body);
  });
}, function(err, results){
  console.log(results);
});

對於您的示例,我需要查看您的get_options函數。 它是同步的嗎? 如果是的話,你可以這樣做

var async = require('async');
var request = require('request');
var options;
async.map([item1, item2], function(item, callback){
  options = get_options(item);
  request(options, function (error, response, body) {
    callback(error, body);
  });
}, function(err, results){
  console.log(results);
});

如果您的get_options是異步的並且接受回調,請執行以下操作:

var async = require('async');
var request = require('request');
async.map([item1, item2], function(item, callback){
  get_options(item, function(err, option){
    if(err) {
      callback(err);
    }
    else{
      request(options, function (error, response, body) {
       callback(error, body);
      });
    }
  });
}, function(err, results){
  console.log(results);
});

使用異步庫的地圖功能,您可以

var makeRequest = function(item, callback){
    var options = get_options(item);
    // handle http errors and getting access to body properly
    http.get(options,res){
        callback(null, res)
    }
}

async.map(['item1','item2','item3'], makeRequest(item, callback), function(err, results){
    //check errors do stuff with results
});

如果您有興趣使用諾言,這里也提供了答案:

var Q = require('q');
var http = require('http');

var httpGet = function(url) {
  var data = "", defer = Q.defer();
  http.get(url, function (res) {
    var content_length = parseInt(res.headers['content-length'], 10);
    var total_downloaded = 0;
    if (res.statusCode !== 200) {
      defer.reject("HTTP Error " + res.statusCode + " for " + url);
      return;
    }
    res.on("error", defer.reject);
    res.on("data", function (chunk) {
      data += chunk;
      total_downloaded += chunk.length;
      var percentage = Math.floor((total_downloaded / content_length) * 100);
      defer.notify(percentage);
    });
    res.on("end", function () { defer.resolve(data); });
  });
  return defer.promise;
}

這使用了Q Promise庫。 您可以這樣使用它:

var promise = httpGet("http://example.com/");
promise.then(function (data) {
  // Do something with data.
}, function (reason) {
  // Do something with the error
}, function (progress) {
  // Do something with the progress update (% so far)
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM