【问题标题】:How to read property of object in javascript? [duplicate]如何在javascript中读取对象的属性? [复制]
【发布时间】:2020-09-06 06:10:13
【问题描述】:

你好!

我正在使用带有 React Context API 的 React。我有整个应用程序的App.js 组件。它是功能组件。其中有上下文的状态(useState):

const [contextValue, setContextValue] = useState(null)

还有useEffect

useEffect(() => {
    const wrapper = async () => {
      let data = {};

      const fetchData = () => {
        fetchAbout().then((res) => (data.about = res.data));
        fetchNews().then((res) => (data.news = res.data));
        fetchArticles().then((res) => (data.articles = res.data));
        fetchOffer().then((res) => (data.offer = res.data));
        fetchPortfolio().then((res) => (data.portfolio = res.data));
        fetchQuestions().then((res) => (data.questions = res.data));
      };
      await fetchData();

      console.log(data);
      console.log(data.about);

      setContextValue(data);
    };

    wrapper();
  }, []);

所以在fetchData 函数中,我正在创建data 对象的属性。 所以await fetchData()之后,有2个控制台日志。正如预期的那样,首先是使用其字段记录数据对象:


但是console.log(data.about); 有问题,因为它正在记录undefined!。 我预计,它将是数据对象中 about 字段的值(如第一个 console.log

提前致谢

【问题讨论】:

  • 尝试改变 fetchAbout().then((res) => (data.about = res.data.about));
  • 您的fetchData 返回undefined。您无需等待内部的任何 Promise 解决。使用Promise.all 等待每个Promise 先解决,然后调用setContextValuePromise.all([fetchAbout(), fetchNews()]).then((res) => setContextValue({ about: res[0].data, news: res[1].data ...

标签: javascript reactjs react-hooks javascript-objects react-context


【解决方案1】:

fetchData 没有返回一个承诺,所以你不能“等待”它。 当您console.log(data.about) 时,数据尚未填充。 你可以解决它

  const fetchData = () => {
    return Promise.all([
       fetchAbout().then((res) => (data.about = res.data)),
       fetchNews().then((res) => (data.news = res.data)),
       fetchArticles().then((res) => (data.articles = res.data)),
       fetchOffer().then((res) => (data.offer = res.data)),
       fetchPortfolio().then((res) => (data.portfolio = res.data)),
       fetchQuestions().then((res) => (data.questions = res.data)),
    ])
  };

【讨论】:

  • 非常感谢,它解决了我的问题。你能解释一下,Promise.all() 是如何工作的吗?
  • promise.all 获取一组承诺并返回一个承诺,该承诺在所有承诺解决后解决(如果一个或多个失败,它将拒绝)
猜你喜欢
  • 1970-01-01
  • 2018-06-08
  • 1970-01-01
  • 2021-10-29
  • 2013-09-10
  • 2012-04-18
  • 2010-11-23
  • 2010-09-10
相关资源
最近更新 更多