使用 Fetch 和分页的 Javascript,递归?

标签 javascript recursion pagination fetch-api

您好,我是 Javascript 和 API 的新手。

但我有一个练习,我应该从中获取数据。

https://swapi.co/api/planets/

问题是它没有一次列出所有行星,所以 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”放在哪里,这样我就知道所有的行星都已经被加载了,而不是当它们被添加到数组时一个一个地加载。

最佳答案

您可以递归地创建 promise 解析链。少一点重复,当父 promise 解决时,您就会知道何时加载所有行星。

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);

关于使用 Fetch 和分页的 Javascript,递归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49129245/

相关文章:

javascript - MVC 4 基于复选框检查显示/隐藏文本框

javascript - 更改 JSON 时无法读取未定义的属性 'appendChild'

c# - 如果函数包含同名的局部函数,如何递归调用函数?

javascript - 递归函数过早退出for循环

java - 如何扩展 JavaFX 分页导航以显示附加控件?

javascript - 如何使用 ES6/7 对 html 元素中的所有文本运行大量正则表达式替换?

javascript - 包含字符串的 getItem localstorage

c++ - 使用递归函数加密用户输入

java - 带分页的语言环境敏感排序策略

mysql - 使用 spring MVC 和 mysql 实现分页的最佳方法是什么