从 async 和 await 函数返回值说原理

发布时间 2023-05-04 12:23:08作者: pwindy

async 和 await 如何工作,如何正确的使用 async 和 await 。  

1.什么是async和await

简单来说,它们是promise嵌套的语法糖

async function helloAsync() {
    const result = await new Promise((resolve) =>
        setTimeout(() => resolve("Hello"))
    );
    console.log(result); // Hello
}

helloAsync();

运行上面的代码,函数将输出"Hello",结果显而易见,其中await将阻塞主线程,直到promise处理完成。

2.async

async函数使我们能够编写基于promise的代码,就像它是同步的一样,但不会阻塞执行线程。

通过事件循环异步运行,async函数将始终返回一个值。

使用async简单地将返回一个promise,如果promise没有返回,会自动将它包装在一个promise带有它的指的resolve中。

3.await

await运算符用于等待promise,它只能在async块内使用。关键字await使JavaScript等待直到promise返回结果。

需要注意:await只是让async功能块等待,而不是整个程序执行。不能在常规函数中使用await关键字。

猜猜下面代码片段的输出。

async function helloAsync() {
    const result = await new Promise((resolve) =>
        setTimeout(() => resolve("Hello"))
    );
    return result;
}
let asyncResult = helloAsync();
console.log("helloAsync返回值:" + jsON.stringify(asyncResult));

根据上面的代码,可能会认为输出 “Hello” ,对与错要眼见为实,复制上面的代码运行后,输出为:asyncResult值:{},从输出来看,变量 asyncResult 的值为{} 。

3.1.为什么会这样?

因为异步函数总是返回一个promise,而不是解决上面例子中的promise。

3.2.如何解决?

由于async函数在上面的代码片段中返回了一个promise对象,那么就可以使用.then方法来获取async函数的处理结果

async function helloAsync() {
    const result = await new Promise((resolve) =>
        setTimeout(() => resolve("Hello"))
    );
    return result;
}

helloAsync().then((data) => {
    console.log("helloAsync返回值:" + jsON.stringify(data));
});

3.3.更好的方法

使用async和await主要是想避免使用promise链或者.then表达式,所以可以使用async和await本身来解决promise,而不是使用.then

function helloAsync() {
  return new Promise((resolve) =>
        setTimeout(() => {
          console.log('hello');
            resolve("hello")
        })
    );
}
async function testHelloAsync() {
    await helloAsync();
    console.log('hello2');
}

testHelloAsync();

参考---https://mp.weixin.qq.com/s/Q1BHy69307vDJdmhZ5tsOA