async和await

        async是一个加在函数前的修饰符,被async定义的函数会默认返回一个Promise对象resolve的值。因此对async函数可以直接then,返回值就是then方法传入的函数。 

        await 也是一个修饰符,只能放在async定义的函数内。可以理解为等待。await 修饰的如果是Promise对象:可以获取Promise中返回的内容(resolve或reject的参数),且取到值后语句才会往下执行;如果不是Promise对象:把这个非promise的东西当做await表达式的结果。

function doubleAfter2seconds(num){
            return new Promise((resolve,reject) => {
                setTimeout(() => {
                    return resolve(2 * num)
                },2000)
            })
        }

        doubleAfter2seconds(30).then((s) => {
            console.log(s)
        })
        console.log(doubleAfter2seconds(40)) //返回Promise
        async function testResult(){
            let result = await doubleAfter2seconds(30);
            console.log(result)
        }
        //现在我们看看代码的执行过程,调用testResult 函数,它里面遇到了await,await 表示等一下,
        //代码就暂停到这里,不再向下执行了,它等什么呢?等后面的promise对象执行完毕,
        //然后拿到promise resolve 的值并进行返回,返回值拿到之后,它继续向下执行。
        //具体到我们的代码, 遇到await 之后,代码就暂停执行了, 等待doubleAfter2seconds(30) 执行完毕,
        //doubleAfter2seconds(30) 返回的promise 开始执行,2秒 之后,
        //promise resolve 了, 并返回了值为60, 这时await 才拿到返回值60, 
        //然后赋值给result, 暂停结束,代码才开始继续执行,执行 console.log语句。
        
        async function fun(){
            let a = await 1;
            let b = await new Promise((resolve,reject)=>{
                setTimeout(function(){
                    resolve('setTimeout')
                },2000)
            })
            let c = await function(){
                return 'function'
            }()
            let d = await new Promise((resolve,reject)=>{
                setTimeout(function(){
                    resolve('ddddd')
                },2000)
            })
            console.log(d)
            console.log(a,b,c)
        }
        fun();

控制台立即输出

2s后控制台输出

4s后控制台输出

 

        函数异步,不影响其他函数的执行,但是内部的await则需要按顺序同步执行,fun的执行需要4s不影响上述函数doubleAfter2seconds的执行2s,所以网页运行后2s输出doubleAfter2seconds的值,但是4s才输出fun的值.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值