2016-10-23 17 views
0

ノードを使用して海賊版のトップ100の映画のトレントをスキャンし、各結果のムービーポスターを追加しようとしています。node.jsのループ内で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); 
    }) 
}) 
}); 

で結果を返すことができています、私はこれらのライブラリに

thepiratebay imdb-api

を使用しています私はまた、経由で映画を検索することができています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の呼び出しを取り除き、値["picture"] = "foo"に置き換えてください。それは動作します。これがノードがループをどのように処理するかに関係があるかどうかはわかりません。私は、JSの世界に新たなんだとルビーの背景にあなたは非同期モジュールと正しい軌道に乗っている

+0

パイレーツベイがダウンしているので、おそらくこれを削ることはおそらく動作しません。 – adeneo

+0

いいえ、そうではありません。私の問題はとにかくtpbではありません – Nodeyboopers

+0

これらの機能が何であるかは明確ではありません。「非同期」が何であるかは明らかではありませんが、通常の非同期ミドルウェアだと仮定しています。とにかく 'imdb.getReq()'は非同期で、おそらくイメージを取得していますが、 'res.send()'はそれよりずっと前に起きます。おそらくIMDBからの最初の応答を返して最初のイメージを置き換える前です。 – adeneo

答えて

0

事前に

感謝を持っていますが、IMDB要求はそれほどres.sendがちょうど最初の結果で呼び出さも非同期であります第二引数として最初の関数の結果を渡すなるasync.map

のあなたはIMDBコールの別のasync.mapを使用することができますし、それらをasync.waterfallでそれらを鎖(async.applyは自分topMoviesとTPB関数を呼び出します)。

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

ありがとう、助けていただきありがとうございますが、これは私のためには動作しません。私はそれから応答を得る – Nodeyboopers

関連する問題