Javascript using Fetch and pagination, recursive?

前端 未结 2 1547
情书的邮戳
情书的邮戳 2020-12-17 03:36

Hello I\'m new to Javascript and APIs.

But I have an excersise where I should get Data from.

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

The problem is that it doe

2条回答
  •  猫巷女王i
    2020-12-17 04:23

    You could recursively create a promise resolve chain. A bit less repetition and you'll know when all planets are loaded when the parent promise resolves.

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

提交回复
热议问题