【问题标题】:Handle async foreach loop then dispatch to redux处理异步 foreach 循环然后分派到 redux
【发布时间】:2019-07-05 12:38:10
【问题描述】:

我希望从 youtube api 获取搜索结果,并且我想循环调用结果以获取每个视频信息。然后我想将挂起的 api 调用的结果发送到 redux 存储。我的问题是我想让我的代码可重用,所以当循环完成时我无法让函数返回。

所以我要做的是设置 3 个不同的功能。第一个将具有初始 api 调用以获取搜索结果。相当简单。第二个将遍历第一个函数的结果并返回所有单个视频信息。第三个函数将从 redux 中的 mapDispatchToProps 方法调用,以将结果分派到 redux 存储区。

我的问题是在第二个函数中,我无法让 foreach 循环的结果返回。我试图返回一个新的承诺和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() 调用不同的 URL 到 getVideos() 进行分页等。如果我只编写一个长函数并在满足 if 条件后从 for 循环内的 then() 调度,我可以让一切正常工作,但是我将有一堆代码并且看起来有点多所以我想将其整合为我在上面想要实现的目标。希望任何帮助都有意义。

【问题讨论】:

    标签: javascript reactjs loops asynchronous foreach


    【解决方案1】:

    我认为Promise.all 会解决你的问题:

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

    【讨论】:

    • 你能详细说明一下吗。我还编辑了我的问题,以便更清楚地了解问题所在。
    • 好的,我明白了,谢谢这是正确的方法,而不是试图从 for 循环中返回,非常感谢
    猜你喜欢
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 2016-06-17
    • 1970-01-01
    相关资源
    最近更新 更多