2015-12-22 60 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 
}); 
相關問題