【问题标题】:How to use request within async.each in node.js Express如何在 node.js Express 中的 async.each 中使用请求
【发布时间】:2015-12-22 02:40:29
【问题描述】:

在我的 node.js 项目中,我需要进行迭代 API 请求,因此我使用的是 async.each 方法。

控制台抱怨 url 未定义,我理解这一点,因为我只声明了 urls,它是一个 url 数组。

我只是不确定如何将请求模块中的 request() 放在 async.each 中。为了满足 async.each() 我将 urls 作为第一个参数,但 request() 本身需要一个查询字符串参数,即 url。

我还使用下划线中的 _.extend 来合并两个响应,但我不确定我目前的位置是否正确。

有人可以指点我正确的方向吗?

var urls = [];

Object.keys(result.items).forEach(function(item) {
  urls.push("https://www.googleapis.com/youtube/v3/videos?part=contentDetails&id=" + result.items[item].contentDetails
    .videoId + "&key=xxx");

})

async.each(
  urls,
  request(url, function(err, response, body) {
    if (err) {
      console.log(err);
      return;
    }
    body = JSON.parse(body);
  }),
  function() {
    var extended = _.extend(result, body);
    getVideoDetailsCallback(null, extended)
  });

【问题讨论】:

    标签: javascript node.js asynchronous


    【解决方案1】:

    您似乎正在使用回调和所有方法调用 request,而不仅仅是引用它,这意味着您可能需要一个匿名函数调用。

    另外,如果你想要一个数组结尾,或者你要扩展的任何东西,你可以使用 async.map 代替,然后做类似的事情

    var urls = Object.keys(result.items).map(function(item) {
        return "https://www.googleapis.com/youtube/v3/videos?part=contentDetails&id=" + result.items[item].contentDetails.videoId + "&key=xxx";
    });
    
    async.map(urls, function(url, callback) {
        request(url, function(err, response, body) {
            if (err) {
                return callback(err);
            }
            callback(null, JSON.parse(body));
        });
    }, function(err, extended) {
        if (err) {
            // handle error
        }
        // extended is an array containing the parsed JSON
        getVideoDetailsCallback(null, extended); 
    });
    

    【讨论】:

    • 谢谢。看起来很有希望。我使用 _.extend 是因为我需要将包含已解析 JSON 的 extended 与来自第一个 API 请求的响应合并。这是我之前的问题,它显示了使用 async.waterfall 的结构。 stackoverflow.com/questions/34406490/…如何将此迭代中的 JSON 与其他响应中的另一个 JSON 合并?
    • 使用.map 时,在最终回调extented 中接收到的数据将是一个数组,其中包含来自所有请求的数据。我可能会修改 getVideoDetailsCallback 函数以采用这样的数组,并将该函数作为最终回调引用,但如果您想合并最终数组,您可能需要更多类似的东西 -> stackoverflow.com/questions/27556728/…
    【解决方案2】:

    如果您想从每次迭代中获取结果。我建议使用async.map。 Map 将结果数组返回给最终回调。

    这是一个例子,

    var async = require('async');
    
    async.map([ 1, 2, 3, 4 ], function ( num, cb ) {
      cb(null, num);
    }, function (error, results) {
      console.log(results);
    });
    // output: [ 1, 2, 3, 4 ] 
    

    至于您的代码 sn-p,您的第二个参数是错误的类型。您正在调用不返回函数的请求。第二个参数应该是一个函数,所以你需要做的是围绕函数定义包装请求。

    async.map(urls, function(url, callback) {
      request(options, callback);
    }, function (error, results) {
      // do something with results
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-10
      • 2013-02-08
      • 2012-07-10
      • 2018-02-09
      • 1970-01-01
      • 2012-02-03
      • 1970-01-01
      • 2012-03-23
      相关资源
      最近更新 更多