async function - await not waiting for promise

前端 未结 4 1183
生来不讨喜
生来不讨喜 2020-12-30 22:52

I\'m trying to learn async-await. In this code -

const myFun = () => {
    let state = false;

    setTimeout(() => {state = true}, 2000);

    return         


        
相关标签:
4条回答
  • 2020-12-30 23:37

    This is my routine dealing with await and async using a Promise with resolve and reject mechanism

        // step 1 create a promise inside a function
        function longwork()
        {
            p =  new Promise(function (resolve, reject) {
                result = 1111111111111 // long work here ; 
    
                if(result == "good"){
                    resolve(result);
                }
                else
                {
                    reject("error ...etc")
                } 
            })
    
            return p
        }
    
        // step 2 call that function inside an async function (I call it main)and use await before it
        async function main()
        {
             final_result = await longwork();
             //..
    
        }  
    
        //step 3 call the async function that calls the long work function
        main().catch((error)=>{console.log(error);})
    

    Hope that saves someone valuable hours

    0 讨论(0)
  • 2020-12-30 23:40

    If you're using async/await, all your calls have to use Promises or async/await. You can't just magically get an async result from a sync call.

    Your final call needs to be:

    getResult().then(response => console.log(response));
    

    Or something like:

    (async () => console.log(await getResult()))()
    
    0 讨论(0)
  • 2020-12-30 23:41

    There is no point to async and await when this is the actual case:

    Promise.resolve(3).then(console.log); console.log(4);
    4
    3
    

    In other words, since the then() forks and runs slower than the subsequent statements (even for a resolved Promise) then we need to put the subsequent statements inside the then, like:

    Promise.resolve(3).then(_ => { console.log(_); console.log(4); });
    3
    4
    

    And since that is true then why bother to await. So Im yet to see why async and await even exist.

    0 讨论(0)
  • 2020-12-30 23:49

    What you need to understand is that async/await does not make your code run synchronously, but let's you write it as if it is:

    In short: The function with async in front of it is literally executed asynchronously, hence the keyword "async". And the "await" keyword wil make that line that uses it inside this async function wait for a promise during its execution. So although the line waits, the whole function is still run asynchronously, unless the caller of that function also 'awaits'...

    More elaborately explained: When you put async in front of a function, what is actually does is make it return a promise with whatever that function returns inside it. The function runs asynchronously and when the return statement is executed the promise resolves the returning value.

    Meaning, in your code:

    const getResult = async () => {
        return await myFun();
    }
    

    The function "getResult()" will return a Promise which will resolve once it has finished executing. So the lines inside the getResult() function are run asynchronously, unless you tell the function calling getResult() to 'await' for it as well. Inside the getResult() function you may say it must await the result, which makes the execution of getResult() wait for it to resolve the promise, but the caller of getResult() will not wait unless you also tell the caller to 'await'.

    So a solution would be calling either:

    getResult().then(result=>{console.log(result)})
    

    Or when using in another function you can simply use 'await' again

    async callingFunction(){
        console.log(await(getResult());
    }
    
    0 讨论(0)
提交回复
热议问题