如何跨多个页面获取数据
How to fetch data over multiple pages?
我的项目基于 React, redux, redux-saga, es6,我尝试从这个 API 获取数据:
http://api.dhsprogram.com/rest/dhs/data/BD,2000,2004,2007?&returnFields=CharacteristicLabel,Indicator,IndicatorId,Value&f=json
如您所见,此特定 API 调用显示的数据限制为每页 100 个数据分布在 40 页上。
根据这个答案:http://userforum.dhsprogram.com/index.php?t=msg&th=2086&goto=9591&S=Google它说您可以将限制扩展到每页最多 3000 个数据。
但是,在某些情况下,我会执行超过该限制的 API 调用,这意味着我不会像这样接收所有数据:
export function fetchMetaData(countryCode: string, surveyYears: string) {
return (fetch('http://api.dhsprogram.com/rest/dhs/data/' + countryCode + ',' + surveyYears + '?returnFields=CharacteristicLabel,Indicator,IndicatorId,Value&f=json')
.then(response => response.json())
.then(json => json.Data.map(survey => survey)))
}
所以我的问题是;鉴于我知道数据的总页数,从此API获取所有数据的最佳方法是什么。论坛链接中的答案建议循环访问 API。但是,我找不到正确的语法用法来执行此操作。
我的想法是做一个 api 调用来获取总页数。然后使用 redux+redux-saga将其存储在一种状态中。然后执行一个新请求,将总页数作为参数发送,并获取此总页数次数。通过这样做,我无法弄清楚存储每次迭代数据的语法。
一个可能的解决方案 - 这个想法是首先获取页数,然后进行适当数量的 API 调用,将每次调用的承诺推送到数组中。 然后,我们等待所有承诺解决,并对返回的数据执行某些操作。
async function fetchMetaData() {
const response = await fetch('apiUrlToGetPageNumber');
const responses = await Promise.all(
Array.from(
Array(resp.data.pagesRequired),
(_, i) => fetch(`apiUrlToSpecificPage?page=${i}`)
)
);
// do something with processedResponses here
}
这是使用 async/await
的另一种可能的解决方案。这样做的好处是total_pages
计数是动态的,因此,如果在您处理请求时它增加,它将确保您获得所有内容。
async function fetchMetaData() {
let allData = [];
let morePagesAvailable = true;
let currentPage = 0;
while(morePagesAvailable) {
currentPage++;
const response = await fetch(`http://api.dhsprogram.com/rest/dhs/data?page=${currentPage}`)
let { data, total_pages } = await response.json();
data.forEach(e => allData.unshift(e));
morePagesAvailable = currentPage < total_pages;
}
return allData;
}
- Ajax-如何获取数据
- 从键值结构中获取数据,并将其与AngularJS中ng重复的值进行比较
- 从数据库中获取数据并插入JavaScript变量
- 从单击的行上的列中获取数据
- Solr查询以按日期月份获取数据&年
- React路由器服务器端渲染和ajax获取数据
- 使用JavaScript在IE9中获取数据列表选项
- 从json子数组获取数据
- 使用angularjs中的rest调用通过id获取数据
- 正在从ruby应用程序中的数据库中获取数据
- 如何从servlet获取数据到ajax成功
- 从选择下拉菜单中获取数据
- 异步获取数据使用JavaScript同步获取数据
- 从服务器获取数据并在选择控件中使用ng选项无法显示选项
- 如何在Angular.js中循环动态添加Fields并获取数据并将其发送到服务器
- JavaScript-获取数据属性的值返回未定义的值
- 如何从文本区域获取数据并使用javascript进行解密
- 在put方法之前从作用域获取数据
- 事件循环的MEAN.JS setInterval进程(从另一个服务器获取数据)
- 使用ReactJS和Flux架构从服务器获取数据的正确方法是什么