2017-04-22 136 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))