javascript - 处理异步 foreach 循环然后分派到 redux
问题描述
我希望从 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()
进行分页和类似的事情。如果我只编写一个长函数并在then()
满足 if 条件后从 for 循环内部分派,我可以让一切正常工作,但是我将有一堆代码并且看起来有点多,所以我想将它整合到类似于我在上面想要实现的目标。希望这是有道理的任何帮助将不胜感激。
解决方案
我认为 Promise.all将解决您的问题:
let promises = videoURLs.map(videoURL => {
return fetch(videoURL)
.then(res => res.json())
})
Promise.all(promises).then(array => {
…
})
推荐阅读
- c++ - 用于登录谷歌的 libcurl 格式化帖子
- html - 无论放大或缩小,如何在 HTML 和 CSS 中定位好项目?
- node.js - 我希望能够在我的反应网络应用程序中打开另一个网址
- c - 在 C 中前向声明一个结构
- reactjs - 带有反应的图像滑块
- javascript - WebSocket 连接到“ws://localhost:8000/”失败:WebSocket 握手期间出错:意外响应代码:403
- python - 无法使用 Python3 和 Selenium 定位 id 元素
- python - 在 c# 上运行带有参数的 python 脚本并且在 cmd 上不会崩溃
- cmake - 确定提供给 cmake_parse_arguments() 的 one_value_keyword 是否没有值
- python - 如何在类 python tkinter OOP 中使用命令更改按钮的背景?