JavaScript、获取、API

问题描述 投票:0回答:2

我想要执行以下操作:从该网站获取随机名称https://swapi.dev/api/people/,我这样做了,我可以在我的html页面中看到它,然后我也想得到一个随机星球,在这里我需要访问 homeworld 密钥,并返回链接,然后返回我格式化以获取随机 URL 的链接,并且从这个链接中我还必须在我的页面上显示星球的名称。第一次获取工作正常,至少我认为,但第三个

.then()
不起作用,或者至少我不知道如何从 homeworld URL 访问信息。这是我第一次尝试
fetch()
,如果你能帮助我告诉我在代码中哪里做错了,也许有不同的解决方案,但不是那么复杂,那就太好了。

let randomNumber = Math.floor(Math.random()*9)


const fetchPromise = fetch("https://swapi.dev/api/people/");

let test
let test2
let planets = document.querySelector('#age')
fetchPromise
    .then((response) => {
        if (!response.ok) {
            throw new Error(`Http error: ${response.status}`);

        }
        return response.json();
    })
    .then((json) => {
        console.log(json.results[randomNumber].name)
        showRandomUserData(json)
        test = json.results[0].homeworld
        test = test.slice(0, -2)
        // console.log(test + randomNumber + "/");
        // console.log(test + "/" + randomNumber + "/");
        test = test + randomNumber + "/";
        return fetch(test)
        // return fetch("https://swapi.dev/api/planets/2/");
    })
    .then(response => response.json()).then(json =>
    {   test2=json.name
        console.log(test2);
        planets.innerHTML = test2
    }) 

showRandomUserData = (randomUser) => {
    document.querySelector("#name").innerHTML =
        randomUser.results[randomNumber].name;

}


解决了

javascript json es6-promise fetch-api
2个回答
2
投票

这是一个简单的解决方案,使用

fetch()
从这两个 URL 获取数据,然后将返回到您的网页中的所有人员和一个星球插入:

function myFetch(...args) {
    return fetch(...args).then(response => {
        if (!response.ok) {
            throw new Error(`fetch failed with status ${response.status}`);
        }
        return response.json();
    });
}

Promise.all([
    myFetch("https://swapi.dev/api/people/"),
    myFetch("https://swapi.dev/api/planets/2/")
]).then(([people, planet]) => {
    const peopleDiv = document.getElementById("people");
    let peopleHTML = "";
    for (let p of people.results) {
        peopleHTML += `<div>${p.name}</div>`;
    }
    peopleDiv.innerHTML = peopleHTML;
    
    const planetDiv = document.getElementById("planets");
    let planetHTML = `<div>${planet.name}</div>`;
    planetDiv.innerHTML = planetHTML;
}).catch(err => {
    console.log(err);
});
<div id="people"></div>
<hr>
<div id="planets"></div>

至于使用结果,人员 URL 返回如下所示的结构:

{
  count: 82,
  next: 'https://swapi.dev/api/people/?page=2',
  previous: null,
  results: [
    {
      name: 'Luke Skywalker',
      height: '172',
      mass: '77',
      hair_color: 'blond',
      skin_color: 'fair',
      eye_color: 'blue',
      birth_year: '19BBY',
      gender: 'male',
      homeworld: 'https://swapi.dev/api/planets/1/',
      films: [Array],
      species: [],
      vehicles: [Array],
      starships: [Array],
      created: '2014-12-09T13:50:51.644000Z',
      edited: '2014-12-20T21:17:56.891000Z',
      url: 'https://swapi.dev/api/people/1/'
    },
    {
      name: 'C-3PO',
      height: '167',
      mass: '75',
      hair_color: 'n/a',
      skin_color: 'gold',
      eye_color: 'yellow',
      birth_year: '112BBY',
      gender: 'n/a',
      homeworld: 'https://swapi.dev/api/planets/1/',
      films: [Array],
      species: [Array],
      vehicles: [],
      starships: [],
      created: '2014-12-10T15:10:51.357000Z',
      edited: '2014-12-20T21:17:50.309000Z',
      url: 'https://swapi.dev/api/people/2/'
    }
}

因此,您有

people.results
,它是一个数组,您可以访问
people.results[n]
以从该数组中获取项目。该项目将是一个具有
.name
.height
等属性的对象...


您显示的特定行星 URL 返回单个行星对象,如下所示:

{
  name: 'Alderaan',
  rotation_period: '24',
  orbital_period: '364',
  diameter: '12500',
  climate: 'temperate',
  gravity: '1 standard',
  terrain: 'grasslands, mountains',
  surface_water: '40',
  population: '2000000000',
  residents: [
    'https://swapi.dev/api/people/5/',
    'https://swapi.dev/api/people/68/',
    'https://swapi.dev/api/people/81/'
  ],
  films: [
    'https://swapi.dev/api/films/1/',
    'https://swapi.dev/api/films/6/'
  ],
  created: '2014-12-10T11:35:48.479000Z',
  edited: '2014-12-20T20:58:18.420000Z',
  url: 'https://swapi.dev/api/planets/2/'
}

因此,您可以像

planet.name
中那样访问该对象的属性。


请注意,人员结果已分页。总共有 82 个结果,但第一个结果中只有 10 个。其余的带有其他页面的结果,例如

https://swapi.dev/api/people/?page=2


0
投票

类似于这个答案,但使用 async/await 来避免回调地狱。如果可以的话,请尝试使用这种方法。 为什么?

jfriend00 在该答案中极力建议使用 Promise.all

 而不是单独的提取调用,因为这样可以并行进行提取。 
了解更多

沙箱进行测试和尝试

const fetchData = async (...args) => { try { const response = await fetch(...args); return response.json(); } catch (err) { throw new Error(`fetch failed with status ${err?.message}`); } }; const updateDOM = (people, planet) => { document.getElementById("people").innerHTML = people.results.reduce((s, p) => s + `<div>${p.name}</div>`, ""); document.getElementById("planets").innerHTML = `<div>${planet.name}</div>`; }; const populateData = async () => { try { const [people, planet] = await Promise.all([ fetchData("https://swapi.dev/api/people/"), fetchData("https://swapi.dev/api/planets/2/"), ]); // do stuff with 'people' or 'planet' // example, get // const firstPersonsHomeworld = people.results[0].homeworld; // console.log(firstPersonsHomeworld); // or // const planetName = planet.name; // console.log(planetName); updateDOM(people, planet); } catch (err) { // errorHandler(err); console.error(err); } }; // start app populateData();
    
© www.soinside.com 2019 - 2024. All rights reserved.