Async和Await

205 阅读2分钟

基础概念

  • 实际上是generator函数的语法糖
  • await只能用在async函数里面,不然会报错
  • async函数会返回一个promise对象,而且这个promise对象是执行完resolve的
  • await后面

async函数

     ```async function cc(){
         return 111
     }
     console.log(cc());
     //cc()变成了prmose对象,并且执行了resolve()
     //因此可以调用then方法
     //会把return的参数作为resolve的结果
     //从而在then中输出
     cc().then(res=>{
         console.log(res);//111
     })```

await

作用:await其实和generator中的yield关键字一样,但是await后面要是跟promise的话, 只有等到这个promise的状态发生变化之后,才会进行后续的步骤! function dd1(){ return new Promise((resolve,reject)=>{ setTimeout(resolve,1000) }) } async function dd(){ await dd1() //1只会等到dd1()这个promise 的状态发生变化才会执行 console.log(1); } dd() 同时,await也会返回promise执行的结果 function dd1(){ return new Promise((resolve,reject)=>{ setTimeout(resolve('结果打印'),1000) }) } async function dd(){ let a=await dd1() //同时await会返回promise的resolve执行的结果 console.log(a);//结果打印 } dd()

错误处理

    async function cc() {
        //用try,catch来捕捉错误
        //因为await不能直接返回错误的结果
        try { await dd() }
        catch (err) {
            console.log(err);
        }
    }
    cc()

继发

缺点:是继发性,不能实现像promise.all一样。同步并发,只能一个一个执行,从而造成时间浪费。因此,有些时候还是用all比较好

嵌套

function sleep(duration) {
    return new Promise(resolve => {
        setTimeout(resolve, duration);
    })
}
async function changeColor(color, duration) {
    console.log('当前颜色', color);
    await sleep(duration);
}
async function main() {
//async函数会自动执行resolve
    await changeColor('红色', 2000);
    await changeColor('黄色', 1000);
    await changeColor('绿色', 3000);
}
main();

面试

  • sleep
        //实现一个sleep函数,隔1s打印输出1-10
        function dd(){
            return new Promise((resolve,reject)=>{
                setInterval(resolve, 1000);
            })
        }
        async function cc(){
            for(var i=0;i<10;i++){
                await dd()
                console.log(i);
            }
        }
        cc()