您好我是Javascript和API的新手。
但我有一个特殊的地方,我应该从中获取数据。
问题在于它没有一次列出所有行星,因此URL仅显示前10个条目,而https://swapi.co/api/planets/?page=2显示下一个,依此类推。
这是我目前的代码,它有效,但我不认为我会按照我应该这样做,所以我想知道你将如何解决这个问题。
https://codepen.io/indiehjaerta/pen/QQXVJX
var starWarsAPI = new StarWarsAPI();
starWarsAPI.Initialize();
function StarWarsAPI()
{
this.planets = new Array();
this.Initialize = function()
{
this.LoadPlanets("https://swapi.co/api/planets");
}
this.LoadPlanets = function(aURL)
{
fetch(aURL).then(
function (response)
{
if (response.status !== 200)
{
console.log('Looks like there was a problem. Status Code: ' + response.status);
return;
}
response.json().then(
data => this.LoadPlanetsRecursive(data)
);
}.bind(this)
).catch(function (err)
{
console.log('Fetch Error :-S', err);
});
}
this.LoadPlanetsRecursive = function(aData)
{
for (let planet of aData.results)
{
let newPlanet = new Planet(planet);
this.planets.push(newPlanet);
}
if (aData.next != null)
{
fetch(aData.next).then(
function (response)
{
if (response.status !== 200)
{
console.log('Looks like there was a problem. Status Code: ' + response.status);
return;
}
response.json().then(
data => this.LoadPlanetsRecursive(data)
);
}.bind(this)
).catch(function (err)
{
console.log('Fetch Error :-S', err);
});
}
}
this.PresentPlanetsInHTML = function()
{
}
}
function Planet(aPlanet)
{
this.name = aPlanet.name;
console.log(this);
}
第二个问题是我应该把我的“PresentData”放在哪里,所以我知道所有的行星都被加载了,而当它们被添加到数组时不是1比1。
答案 0 :(得分:4)
您可以递归创建承诺解析链。重复一点,你知道当父承诺解决时所有行星的加载时间。
function getStarWarsPlanets(progress, url = 'https://swapi.co/api/planets', planets = []) {
return new Promise((resolve, reject) => fetch(url)
.then(response => {
if (response.status !== 200) {
throw `${response.status}: ${response.statusText}`;
}
response.json().then(data => {
planets = planets.concat(data.results);
if(data.next) {
progress && progress(planets);
getStarWarsPlanets(progress, data.next, planets).then(resolve).catch(reject)
} else {
resolve(planets);
}
}).catch(reject);
}).catch(reject));
}
function progressCallback(planets) {
// render progress
console.log(`${planets.length} loaded`);
}
getStarWarsPlanets(progressCallback)
.then(planets => {
// all planets have been loaded
console.log(planets.map(p => p.name))
})
.catch(console.error);
答案 1 :(得分:0)
我也有类似的需求,所以我写了一个名为fetch-paginate的库-这是一个示例:https://codepen.io/AndersDJohnson/pen/Jqadoz
fetchPaginate.default("https://swapi.co/api/planets", {
items: page => page.results,
params: true
})
.then(res => {
res.data.forEach(planet => {
const newPlanet = new Planet(planet);
this.planets.push(newPlanet);
})
})