簡體   English   中英

在node.js中的循環內進行api調用

[英]Making an api call inside a loop in node.js

我正在嘗試使用node掃描海盜灣上排名前100的電影洪流,並為每個結果添加電影海報。

我正在使用這些庫

thepiratebay imdb-api

我能夠找到前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.

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