有没有办法访问流派元素

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

我正在创建一个 Netflix 克隆,并使用 TMDB API 来获取数据,但我遇到了这个问题,当我尝试访问数据时,它显示未定义,但当我记录 JSON Promise 时,它显示如下:

Promise {<pending>}
[[Prototype]]: Promise
[[PromiseState]]: "fulfilled"
[[PromiseResult]]: Object

An Image format of object opened form

这是代码:

let fetchDatas = [] // To store Json Data

const fetchData = async () => {
    let data = await fetch(`${baseURL}?api_key=${API_KEY}`); // baseURL = 'https://api.themoviedb.org/3/genre/movie/list' && API_KEY is private.

    if (data.status === 200) {
        return await data.json();
    }
}

fetchDatas = fetchData();
console.log(fetchDatas);

fetch(`${baseURL}?api_key=${API_KEY}`)
    .then(response => response.json())
    .then(data => {
        fetchDatas = data;
    })

console.log(fetchDatas);

每当我使用 API 时都会出现此问题。怎么解决这个问题?

我需要访问 Promise JSON 数据及其元素。即:

"fetchDatas['genres']
fetchDatas.genres
之类的东西或任何方式!”

这样我就可以将它应用到我的 Netflix 克隆中

javascript fetch-api es6-promise netflix
1个回答
0
投票

您面临的问题是将异步代码视为同步代码的结果。这是一个错误。请查看下面的链接之一,了解有关 Promise 的更多信息(尤其是来自 web.dev 的链接)。

下面的代码,应该可以更好地演示它:

console.log('First code line')
let result = []

console.log('Before fetch')
fetch(`${baseURL}?api_key=${API_KEY}`)
    .then(response => {
      console.log('Got data, convert to object')
      response.json()
    }).then(data => {
        console('Got json data')
        result = data;
    })

console.log('Before result')
console.log(result);
console.log('Last code line')

您将看到“结果之前”和“最后一个代码行”在它甚至说“获取数据,转换为对象”之前被打印。当

fetch()
返回一个 Promise 时,代码将继续同步执行,而异步代码(Promise 处理程序
.then(...)
仅当新数据到达时(Promise 满足或拒绝)才会被触发。所以只要你不能这样做高级
await
,你必须处理
then/catch
语句。工作代码如下所示:

function handleGenre(data) {
  // do with the api response what ever you like, like updating the GUI.
  console.table(data)
}

fetch(`${baseURL}?api_key=${API_KEY}`)
    .then(res => res.json())
    .then(handleGenre)
    .catch(e => console.error(e))

更多关于承诺的信息:

© www.soinside.com 2019 - 2024. All rights reserved.