【问题标题】:React - How do I get fetched data outside of an async function?React - 如何在异步函数之外获取获取的数据?
【发布时间】:2019-11-17 06:04:47
【问题描述】:

我试图在 fetchUserData() 函数之外获取“body”的数据。 我只想将它存储在一个变量中以备后用。 也尝试修改状态,但也没有用。 感谢您的帮助:)

const [userData, setUserData] = useState();

  async function fetchUserData () {
    try {
    const result = await fetch(`/usermanagement/getdocent`, {
      method: "GET"
    });
    const body = await result.json();
    //setUserData(body);
    return(
      body
    )
    } catch (err) {
      console.log(err);
    }
  }

  let userTestData
  fetchUserData().then(data => {userTestData = data});
  console.log(userTestData);
  //console.log(userData);

【问题讨论】:

    标签: reactjs promise async-await return-value


    【解决方案1】:

    使用useEffect

    async function fetchUserData () {
      try {
        const result = await fetch(`/usermanagement/getdocent`, {
          method: "GET"
        })
    
        return await result.json()
      } catch (err) {
        console.log(err)
        return null
      }
    }
    
    const FunctionalComponent = () => {
      const [userData, setUserData] = useState()
    
      useEffect(() => {
        fetchUserData().then(data => {
          data && setUserData(data)
        })
      }, []) // componentDidMount
    
      return <div />
    }
    

    Ben Awad's awesome tutorial

    例子:

    【讨论】:

    • 您好,谢谢您的帮助。我试过了,但它对我不起作用。我只是收到错误,userData 是“未定义的”。我想知道我做错了什么。
    • 添加示例。你从哪里得到undefined?您可以通过放置一些console.logs 来调试您的代码,然后查看错误在哪里...
    【解决方案2】:

    看起来你让它变得比它应该的更复杂。当您收到响应时,即带有异步函数内数据的已解决承诺,只需设置状态,在下一次渲染中您应该会获得更新的数据。

    示例

    const [userData, setUserData] = useState();
    
    useEffect(() => {
     const getResponse = async () => {
      try {
       const result = await fetch(`/usermanagement/getdocent`, {
        method: "GET"
       });
       const body = await result.json();
       setUserData(body);
      } catch (err) {
       console.log(err)
      }
     }
    
     getResponse();
    }, [])
    
    console.log(userData);
    return <div></div>
    

    假设您只需要调用一次函数定义并在 useEffect 或“componentDidMount”中调用它。为了在 useEffect 中使用异步函数,我们需要定义另一个函数然后调用它。

    【讨论】:

      【解决方案3】:

      当你这样做时

      let userTestData
      
      // This line does not wait and next line is executed immediately before userTestData is set
      fetchUserData().then(data => {userTestData = data}); 
      
      console.log(userTestData);
      
      // Try changing to 
      async someAsyncScope() {
        const userTestData = await fetchUserData();
        console.log(userTestData)
      }
      

      示例:

      state = {
        someKey: 'someInitialValue'
      };
      
      async myAsyncMethod() {
        const myAsyncValue = await anotherAsyncMethod();
        this.setState({ someKey: myAsyncValue });
      }
      
      /*
       * Then in the template or where ever, use a state variable which you update when 
       * the promise resolves. When a state value is used, once the state is updated, 
       * it triggers as a re-render
      */
      render() {
        return <div>{this.state.someKey}</div>;
      }
      

      在您的示例中,您将使用 setUserData 而不是 this.setStateuserData 而不是 {this.state.someKey}

      【讨论】:

      • 您好,感谢您的帮助。试了一下,只得到 userData is undefined 错误。
      • 是的,我的问题是,我的承诺无法解决。我不知道为什么。但在异步函数中,我可以立即控制台记录数据。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-08
      • 2019-04-04
      • 2021-02-12
      • 1970-01-01
      • 1970-01-01
      • 2022-08-17
      相关资源
      最近更新 更多