How to get data returned from fetch() promise?

后端 未结 3 1025
再見小時候
再見小時候 2020-12-11 12:26

I am having trouble wrapping my head around returning json data from a fetch() call in one function, and storing that result in a variable inside of another function. Here i

相关标签:
3条回答
  • 2020-12-11 12:52

    You can make use of new ES6 and Es7 syntax and what others have written is also correct, but this can be more readable and clean,

    you are trying to get aysnc value synchronously, here jsonData will be undefined because, you move to next line of execution before async function(checkUserHosting) is finish executing, this can be written as follows

    const getActivity = async () => {
     let jsonData = await activitiesActions.checkUserHosting(theEmail);
      //now you can directly use jsonData
    }
    

    and you can write checkUserHosting in a different using new syntax like this

    const checkUserHosting = async (hostEmail, callback) => {
     let hostEmailData  = await fetch(`http://localhost:3001/activities/${hostEmail}`)
     //use string literals
     let hostEmailJson = await hostEmailData.json();
     return hostEmailJson;
    }
    
    0 讨论(0)
  • 2020-12-11 12:53

    You're partially right. It's because you're trying to get the result of this asynchronous call in a synchronous fashion. The only way to do this is the same way you deal with any other promise. Via a .then callback. So for your snippet:

    function getActivity() {
        return activitiesActions.checkUserHosting(theEmail).then((jsonData) => {
            // Do things with jsonData
        })
    }
    

    Any function that depends on an asynchronous operation must itself become asynchronous. So there's no escaping the use of .then for anything that requires the use of the checkUserHosting function.

    0 讨论(0)
  • 2020-12-11 12:55

    always return the promises too if you want it to work: - checkUserHosting should return a promise - in your case it return a promise which return the result data.

    function checkUserHosting(hostEmail, callback) {
        return fetch('http://localhost:3001/activities/' + hostEmail)
            .then((response) => { 
                return response.json().then((data) => {
                    console.log(data);
                    return data;
                }).catch((err) => {
                    console.log(err);
                }) 
            });
    }
    

    and capture it inside .then() in your main code:

    function getActivity() {
        let jsonData;
        activitiesActions.checkUserHosting(theEmail).then((data) => {
           jsonData = data;
        }        
    }
    

    EDIT:

    Or even better, use the new syntax as @Senthil Balaji suggested:

    const checkUserHosting = async (hostEmail, callback) => {
     let hostEmailData  = await fetch(`http://localhost:3001/activities/${hostEmail}`)
     //use string literals
     let hostEmailJson = await hostEmailData.json();
     return hostEmailJson;
    }
    
    const getActivity = async () => {
     let jsonData = await activitiesActions.checkUserHosting(theEmail);
      //now you can directly use jsonData
    }
    
    0 讨论(0)
提交回复
热议问题