2017-04-22 3 views
0

こんにちは、次のコードが動作しています。しかし、私が現在行っているように非同期の配列でfindMovie関数を繰り返さない方法があるかどうかは疑問でした。Promise.allの配列内に非同期の複数の関数からDRYコードを作成

var request = require('request-promise'); 
 

 

 
function findMovie(title){ 
 
\t return request(`http://www.omdbapi.com/?t=${title}`) 
 
\t 
 
\t .then(res=>{ 
 
\t \t var movie= JSON.parse(res) 
 
\t \t return [movie["Title"], movie["Year"],movie["Genre"]] 
 
\t }) 
 
} 
 

 
function loadInitialData(movies){  \t 
 
\t return Promise.all(movies) 
 
\t \t .then((response)=>{  \t \t \t \t 
 
\t \t \t \t response.forEach((movie)=>{ 
 
\t \t \t \t \t console.log(movie[0]) 
 
\t \t \t \t }) 
 
\t \t \t }) 
 
} 
 

 
var movies= [findMovie("jason bourne"), findMovie("The Matrix"), findMovie("titanic")]; 
 

 
// Above is the function findMovie being written multiple times to make it work... 
 

 
loadInitialData(movies);

答えて

4

mapを使用すると、配列のすべての要素に対して関数を実行し、新しい配列を返すことができます。だから、あなたは文字列のリストを持っていて、それをムービーのリストにマップすることができます。

var movies= ["jason bourne", "The Matrix", "titanic"].map(function (movie) { 
    return findMovie(movie); 
}); 

あなたの関数は、単一のパラメータを取りますので、あなたはそれをアップneatensれ、マップするために関数名を渡すことができ、さらに

var movies= ["jason bourne", "The Matrix", "titanic"].map(findMovie) 
0

これはあなたのコードとあなたがサポートにバッチリクエストを呼び出しているAPIかどうかに関係するすべてのものとは何の関係もありません。そうした場合、すべてのタイトルを一度に1回のリクエストで渡すことができます。その中にムービーの配列を含むJSONオブジェクトを戻すことができます。繰り返しますが、それがサポートされている場合に限ります。

もし慰めるのであれば、あなたのfindMovie()機能が実行しているすべてのリクエストは並行して実行されるため、ムービーごとに順次リクエストを行うよりも速くなります。

完全性のために、これは実際にDRY(自分を繰り返さないでください)という意味ではありません。 DRYは、同じコードを関数に入れることができるときに何度も何度も書かないことを指します。あなたのコードがDRYでない場合、findMovie()はなく、request()への複数の別々の呼び出しをあなたのメインコード本体に持っています。

0

ここで私はそれ

書きたいの方法は、おそらくです
const request = require('request-promise') 

const findMovie = title => 
    request(`http://www.omdbapi.com/?t=${title}`) 
    .then(JSON.parse) 
    .then(({Title, Year, Genre}) => [Title, Year, Genre]) 

const findMovies = titles => 
    Promise.all(titles.map(findMovie)) 

findMovies(["jason bourne", "The Matrix", "titanic"]) 
    .then(movies => console.log(movies), 
     err => console.error(err.message)) 
関連する問題