axios 异步/等待无法与ComponentDidMount内的react.js一起工作

oknrviil  于 2023-01-25  发布在  iOS
关注(0)|答案(3)|浏览(151)

我正在尝试使用axios获取数据。下面的代码可以正常工作:

componentDidMount(){
    const posts = axios.get("https://jsonplaceholder.typicode.com/posts");
    console.log(posts);
}

但这不是

async componentDidMount(){
    const data = await axios.get("https://jsonplaceholder.typicode.com/posts");
    console.log(data)
}

你知道为什么不管用吗?

i34xakig

i34xakig1#

componentDidMount中没有什么特殊的东西可以阻止它异步。这个特殊的问题看起来像是Axios的问题。使用fetch很容易检查:

async componentDidMount() {
    const data = await fetch("https://jsonplaceholder.typicode.com/posts");
    console.log(await data.json())
}
fsi0uk1n

fsi0uk1n2#

当你说“这段代码可以工作”时,你指的是什么并不十分清楚:控制台中的输出不会是您的帖子列表,对吗?
但是你不需要使用async/await,它们只是语法上的糖衣,调用axios.get同步返回的值是Promise,所以你也可以使用thencatch

componentDidMount(){
  axios.get("https://jsonplaceholder.typicode.com/posts")
    .then(console.log)
    .catch(console.error);
}

这样,您就不需要在react中支持async/await,这似乎是正确设置的一件大事,正如本文所述:https://www.valentinog.com/blog/await-react/注意组件无论如何都会render,因为它不知道你还在等待数据加载,所以当数据加载并且你更新了状态时,它需要再次呈现。

h7appiyu

h7appiyu3#

你的两个片段都运行良好。
你的密码,

componentDidMount(){
  const posts = axios.get("https://jsonplaceholder.typicode.com/posts");
  console.log(posts);
}

这里console.log(posts)将只返回Promise,而不是实际数据。
并且使用async/await

async componentDidMount(){
    const posts = await axios.get("https://jsonplaceholder.typicode.com/posts");
    console.log(posts);
    console.log(posts.data);
    console.log(JSON.stringify(posts.data))
    console.log(JSON.stringify(posts.data[0]));
}

同样在这里,
console.log(posts)-将返回Promise对象,而不是实际数据
console.log(posts.data)-这将返回实际数据数组
console.log(JSON.stringify(posts.data))-这将返回实际数据的stringified版本
console.log(JSON.stringify(posts.data[0]))-这将返回实际数据中第一条记录的stringified版本。
Demo

相关问题