处理异步foreach循环,然后分派到redux

时间:2019-02-11 22:54:17

标签: javascript reactjs loops asynchronous foreach

我希望从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()中分派,我就可以使所有工作正常,但是我将有一堆代码,而且看起来有点多,所以我会喜欢将其合并为类似于我上面要实现的目标。希望任何帮助将是有意义的。

1 个答案:

答案 0 :(得分:1)

我想Promise.all会解决您的问题:

let promises = videoURLs.map(videoURL => {
  return fetch(videoURL)
    .then(res => res.json())
})
Promise.all(promises).then(array => {
  …
})