[英]Making an api call inside a loop in node.js
我正在嘗試使用node掃描海盜灣上排名前100的電影洪流,並為每個結果添加電影海報。
我正在使用這些庫
我能夠找到前100名並毫無問題地返回結果
app.get('/movies', function(req, res){
tpb.topTorrents(207).then(function(topMovies){
async.map(topMovies, tpb.getTorrent, function(err, results){
res.send(results);
})
})
});
我還可以通過IMDB ID查找電影並返回結果
app.get('/imdb', function(req, res){
imdb.getReq({ id: 'tt2660888' }, function(err, things) {
res.send(things);
});
});
我想做的是循環遍歷前100個結果,將imdb id從描述字段中拉出,並查詢imdb將圖片字段替換為結果。
app.get('/movies', function(req, res){
tpb.topTorrents(207).then(function(topMovies){
async.map(topMovies, tpb.getTorrent, function(err, results){
for (var value of results) {
if (S(value.description).contains('www.imdb.com/title/')) {
var imdbId = S(value.description).between('www.imdb.com/title/', '/').s
imdb.getReq({ id: imdbId }, function(err, movie) {
value["picture"] = movie.poster
});
}
}
res.send(results);
})
})
});
由於某些原因,這沒有用,但從直覺上來說對我來說是有意義的。 如果我刪除了imdb-api調用,並將其替換為value [“ picture”] =“ foo”。 確實有效。 我不確定這是否與節點處理循環的方式有關。 我是JS世界的新手,具有紅寶石背景
提前致謝
您使用async模塊走上了正確的軌道,但是imdb請求也是異步的,因此res.send
只會被async.map
的初始結果async.map
您可以使用另一個async.map
的IMDB電話和他們連鎖他們async.waterfall
將通過第一函數的結果作為參數傳遞給第二( async.apply
只是調用與您的TPB功能topMovies
)。
function tpb (topMovies, done) {
async.map(topMovies, tpb.getTorrent, done);
}
function imdb (movies, done) {
function lookup (value, callback) {
if (S(value.description).contains('www.imdb.com/title/')) {
var imdbId = S(value.description).between('www.imdb.com/title/', '/').s
imdb.getReq({ id: imdbId }, function(err, movie) {
value["picture"] = movie.poster
return cb(err, value);
});
} else {
return callback(null);
}
}
async.map(movies, lookup, done);
}
app.get('/movies', function(req, res){
tpb.topTorrents(207).then(function(topMovies){
async.waterfall([async.apply(tpb, topMovies), imdb], function (err, results) {
if (err) {
// do error handling
}
return res.send(results);
});
});
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.