从Promise.all数组中的Async多个函数生成DRY代码

时间:2017-04-22 21:32:08

标签: javascript es6-promise

您好以下代码正在运行。但是,我想知道是否有一种方法可以不重复数组中的函数findMovie,这是我正在进行的多次异步。

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


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

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

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);

3 个答案:

答案 0 :(得分:4)

您可以使用map在数组的每个元素上运行函数并返回一个新数组。因此,您可以拥有一个字符串列表,并将其映射到电影列表。

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

现在因为你的函数只接受一个参数,你可以将函数名称传递给map,这会进一步加剧它

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

答案 1 :(得分:0)

这与您的代码无关,也与您调用的API是否支持批量请求有关。如果确实如此,那么您可以在一个请求中立即传递所有标题,然后获取一个JSON对象,其中包含一系列电影。同样,只有它支持。

如果有任何安慰,您的findMovie()功能所做的所有请求都将并行完成,因此它们比为每部电影发出顺序请求更快。

为了完整起见,这并不是DRY(不要重复自己)的意思。 DRY指的是在将其放入函数时不会反复编写相同的代码。如果您的代码没有干,那么您就不会拥有findMovie(),而是会在主代码主体中多次调用request()

答案 2 :(得分: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))