2015-12-22 28 views
0

在我的node.js项目中,我需要制作迭代API请求,所以我使用的是async.each方法。如何在node.js Express的async.each中使用请求

控制台抱怨url没有定义,我明白这一点,因为我只声明了url是一个数组。

我只是不知道如何可以将request()从请求模块放在一起async.each。为了满足async.each()我把urls作为第一个参数,但request()本身需要一个查询字符串参数,它是url。

我也在用Underscore中的_.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) 
    }); 

回答

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

谢谢。看起来很有希望。我使用_.extend是因为我需要将包含解析的JSON的'extended'与来自第一个API请求的响应合并。这是我以前的问题,显示使用async.waterfall的结构。 http://stackoverflow.com/questions/34406490/node-js-dependant-api-request-calls-using-async-waterfall-and-merge-json-respo 如何合并本次迭代的JSON与另一个JSON从其他回应? –

+0

使用'.map'时,最终回调中收到的数据extented将是一个包含所有请求数据的数组。我可能会修改'getVideoDetailsCallback'函数来获得这样一个数组,并且只是将该函数作为最后的回调函数引用,但是如果你想合并最终数组,你可能需要更多的东西 - > http:// stackoverflow.com/questions/27556728/how-can-i-merge-array-of-objects-with-underscore-js – adeneo

1

的东西,如果你想从每次迭代的结果。我建议使用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 ] 

至于您的代码段,你的第二个论点是错误的类型。您正在调用不返回函数的请求。第二个参数预计是一个函数,所以你需要做的是将请求包装在函数定义中。

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