2017-04-22 95 views
0

數組內的異步多個函數中創建DRY代碼Hello以下代碼正在工作。然而,我想知道是否有一種方法不會像我目前所做的那樣多次異步地重複數組中的函數findMovie。從Promise.All

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,您所呼叫支持批量請求。如果是這樣,那麼您可以在一次請求中同時傳遞所有標題,並將一個JSON對象與其中的一組電影一起取回。再次,只有當它支持。

如果有任何安慰,您的findMovie()函數所做的所有請求都將並行執行,因此它們比爲每部電影進行順序請求要快。

爲了完整起見,這不是真正的幹(不重複自己)的意思。 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))