我希望从youtube api获取搜索结果,并且希望遍历搜索结果以进行通话以获取每个视频信息。然后,我想将待处理的api调用的结果分派到redux存储。我的问题是我想使我的代码可重用,所以在完成循环时我很难让函数返回。
所以我想做的是设置3个不同的功能。第一个将具有初始api调用以获取搜索结果。很简单。第二个将循环浏览第一个函数的结果,并返回所有单个视频信息。第三个函数将从redux中的mapDispatchToProps方法调用,以将结果分派到redux存储。
我的问题是在第二个函数中,我无法获取要返回的foreach循环的结果。我试图返回一个新的Promise和if(videoArr.items.length === videos.length) resolve()
,但是那不起作用,我试图在if条件之后只返回视频,但这也不起作用。
const key = ''
const getVideos = (url) => {
return fetch(url + key)
.then(res => res.json())
}
// ---- Problem is returning videos from this function below finish the setVideos function
const getInfo = (videoArr) => {
let videos = [];
videoArr.items.forEach(function(video, index){
let videoId = video.id.videoId ? video.id.videoId : video.id
fetch('https://www.googleapis.com/youtube/v3/videos?part=snippet%2CcontentDetails%2Cstatistics&id=' + videoId + '&key=' + key)
.then(res => res.json())
.then((result) => {
videos = [...videos, result.items[0]]
if(videoArr.items.length === videos.length) return videos
})
});
}
const setVideos = (url) => dispatch => {
getVideos(url)
.then(result => getInfo(result))
.then(videos => {
dispatch({
type: SET_VIDEOS,
payload: videos
})
})
}
我不太确定这是否是最好的方法,但是我将拥有诸如setVideos()
之类的一些功能,它们会向getVideos()
调用不同的URL进行分页等等。如果只要满足if条件,只要编写一个long函数并从for循环内的then()
中分派,我就可以使所有工作正常,但是我将有一堆代码,而且看起来有点多,所以我会喜欢将其合并为类似于我上面要实现的目标。希望任何帮助将是有意义的。
答案 0 :(得分:1)
我想Promise.all会解决您的问题:
let promises = videoURLs.map(videoURL => {
return fetch(videoURL)
.then(res => res.json())
})
Promise.all(promises).then(array => {
…
})