异步功能 - 等待不等待承诺

async function - await not waiting for promise

我正在尝试学习异步等待。在此代码中 -

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

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

    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if(state) {
                resolve('State is true');
            } else {
                reject('State is false');
            }
        }, 3000);
    });
}

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

console.log(getResult());

为什么我得到的输出是 -

Promise { <pending> }

而不是一些值? getResult() 函数不应该等待 myFun() 函数解析它的承诺值吗?

如果您使用 async/await,您的所有调用都必须使用 Promises 或 async/await。您不能神奇地从同步调用中获得异步结果。

您的最终通话需要:

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

或类似的东西:

(async () => console.log(await getResult()))()

你需要明白的是,async/await不会让你的代码运行同步,而是让你这样写:

简而言之:前面有async的函数,字面上是异步执行的,因此关键字"async"。 "await" 关键字将使在该异步函数中使用它的那一行代码在其执行期间等待承诺。所以尽管线路等待,整个函数仍然是 运行 异步的,除非该函数的调用者也 'awaits'...

更详尽的解释:当你将 async 放在一个函数前面时,实际上所做的是使它 return 成为一个承诺,其中包含任何函数 return。函数 运行 是异步的,当执行 return 语句时,promise 会解析 returning 值。

意思是,在你的代码中:

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

函数 "getResult()" 将 return 一个 Promise,一旦完成执行就会解析。所以 getResult() 函数内的行是异步的 运行 ,除非你告诉调用 getResult() 的函数也为它 'await' 。在 getResult() 函数中你可能会说它必须等待结果,这使得 getResult() 的执行等待它解决承诺,但是 getResult() 的调用者不会等待,除非你也告诉调用者 'await'.

所以一个解决方案是调用:

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

或者在另一个函数中使用时,您可以再次使用 'await'

async callingFunction(){
    console.log(await(getResult());
}

这是我处理 awaitasync 使用 Promise解决拒绝机制

    // 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);})

希望能节省一些宝贵的时间