ES6中的async+await(通俗易懂版)

792 阅读2分钟

这是我参与8月更文挑战的第11天,活动详情查看:8月更文挑战

1:async如何使用和它的背后原理?

1.async 作为一个关键字放在函数前面,用来表示该函数是异步的。且背后原理就是promise

async function fn1() {
    return '你好dlz'
}
function fn2() {
    return new Promise((res,rej)=>{
        res('你好zjx')
    })  
}
console.log(fn1())//Promise { '你好dlz' }
console.log(fn2())//Promise { '你好zjx' }

2.既然原理是prmise的话就可用通过.then获取到成功回调(证明了背后原理是promise)

async function fn1() {
    return 'dlz'
}			
fn1().then((res)=>{
    console.log(res);//打印出来的是dlz
});

3.await如何使用(顾名思义)

这里定义了一个异步函数
function fn2(name) {
    return new Promise((res,rej)=>{
        setTimeout(()=>{
            res(name+'真帅')
        },2000)
    })
}
!!!重点 使用await的时候函数必须要用async定义函数
async function fn1() {
    console.log(await fn2('dlz'))
    console.log(666)
}
fn1()//dlz真帅 666
function fn1() {
    fn2('dlz').then((res)=>{
        console.log(res)
        console.log(666)
    })
}//dlz真帅 666
fn1()

解释:按道理的话fn2中的setTimeout是一个异步任务,应该先输出666的 然而此时先输出了dlz真帅, 说明了await后面的promise表达式没执行完毕之前,下面的代码是阻塞掉的。

**

以上面的代码可能还看不出await的真正作用是什么,如果我们用到好多个promise对象的返回值呢?

**

  function fn2(num) {
        return new Promise((resolve,reject)=>{
            setTimeout(()=>{
                resolve(num+10);
            },1000);    
        });
    }
    async function fn1() {
        fn2(10).then((res1)=>{
             fn2(20).then((res2)=>{
                 fn2(30).then((res3)=>{
                     console.log(res1+res2+res3);
                 });
             });
        }); 
    }
    fn1(); // 三秒之后打印出90
  function fn2(num) {
        return new Promise((resolve,reject)=>{
            setTimeout(()=>{
                resolve(num+10);
            },1000);    
        });
    }
    async function fn1() {
        const res1=await fn2(10); //可以直接通过await拿到返回值
        const res2=await fn2(20);
        const res3=await fn2(30);
        console.log(res1+res2+res3);
    }
    fn1(); // 三秒之后打印出90

4.结论 在这里我们是不是可以明白了await的作用, 在这里我们不需要通过then方法去获取promise的返回值。这样我们用到多个promise对象的返回值是不是就方便很多了,就避免了promise的多层的嵌套。

await在某些情况下可以阻塞后面的代码 可以方便的获取promise的返回值,避免深层的嵌套**