我想在JavaScript中实现一个函数,它调用一系列web服务端点并检查API调用响应中的值。我需要以这样一种方式实现它:首先调用第一个端点页面,然后使用filter方法从响应中过滤出特定的对象。如果找到该对象,则该进程应中断,并且必须返回该对象。但是,如果在第一个端点中找不到该对象,则必须调用第二个端点,并且重复相同的过程,直到找到该对象。
我正在处理的Web服务端点是:
https://jsonmock.hackerrank.com/api/countries?page=1
此接口返回国家/地区数据列表。在这里,页面查询的值从1到25不等。我需要调用端点并检查从1到25的特定国家,直到找到国家对象。
我尝试使用JavaScript Promise和Fetch API来实现这一点,但想不出一个接一个调用API的方法。
我真的很期待你的答复。提前谢谢你。
发布于 2020-05-03 17:55:33
您可以使用async
和await
:
async function findCountry(country) {
for (let page = 1; page < 26; page++) {
console.log("page = " + page); // for debugging only
let response = await fetch("https://jsonmock.hackerrank.com/api/countries?page=" + page);
let {data} = await response.json();
let obj = data.find(obj => obj.name == country);
if (obj) return obj;
}
}
let country = "Belgium";
findCountry(country).then(obj => {
if (obj) {
console.log("The capital of " + country + " is " + obj.capital);
} else {
console.log("Could not find " + country);
}
});
如果您知道数据是按国家名称排序的,那么您可以通过使用二进制搜索来减少请求的平均数量。
发布于 2020-05-03 18:11:30
这里有一种你可以做到的方法。
const url = 'https://jsonmock.hackerrank.com/api/countries'
const fetchFromApi = async (countryName, page) => {
const res = await fetch(`${url}?page=${page}`)
return await res.json()
}
const getCountryFromResults = (countryName, data) => {
const country = countryName.toLowerCase()
return data.find(({name}) => name.toLowerCase() === country)
}
const findCountry = async (countryName) => {
let page = 1;
let totalPages = 1;
while(page <= totalPages) {
const res = await fetchFromApi(countryName, page);
if(totalPages < res.total_pages) {
totalPages = res.total_pages
}
const country = getCountryFromResults(countryName, res.data)
if(country){
return country
}
page = page + 1
}
}
( async () => {
console.log(await findCountry("Afghanistan"))
console.log(await findCountry("Argentina"))
}
)()
https://stackoverflow.com/questions/61579060
复制