async/await 和 Promise的执行顺序问题

探讨了async/await和Promise的执行顺序问题,分析Promise的缺点,并提供三种方法来实现期望的执行顺序,包括在async中使用await定义Promise,使用立即执行函数以及重新定义Promise函数。

async/await 和 Promise的执行问题

项目中使用了async/await ,模拟代码如下:
Promise的缺点:(引用:阮一峰
1.一旦新建,就会立即执行
2.如果不设置回调函数,Promise内部抛出的错误,不会反应到外部
3.当处于pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)
分析可得:原来的p1和p2在定义的时候就会执行

var data='0'
var p1= new Promise(resolve=>{
    console.log('data_p1:'+data)
    setTimeout(()=>{ 
        data='2'
        resolve('Done')
    }, 1000);
})
var p2=new Promise(resolve=>{
    console.log('data_P2:'+data)
    resolve('Done')
})
async function f(){
    console.log('data_f:'+data)
    data='1'
    await p1  //这行其实没用
    await p2  //这行其实没用
}
f()

得到的结果及顺序如下:

data_p1:0
data_P2:0
data_f:0

期望的顺序和结果应该是:

data_f:0
data_p1:1
data_P2:2

如下有3种方法可以实现期望的结果:
1:在async中的await后面直接定义promise,代码如下:

var data='0'
async function f(){
    console.log('data_f:'+data)
    data='1'
    await new Promise(resolve=>{  //替换p1
            console.log('data_p1:'+data)
            setTimeout(()=>{ 
                data='2'
                resolve('Done')
            }, 1000);
        })
    await new Promise(resolve=>{  //替换p2
            console.log('data_P2:'+data)
            resolve('Done')
        })
}
f()

2.立即执行函数,代码如下:

var data='0'
async function f(){
    console.log('data_f:'+data)
    data='1'
    await function(){
        return new Promise(resolve=>{
            console.log('data_p1:'+data)
            setTimeout(()=>{ 
                data='2'
                resolve('Done')
            }, 1000);
        })
    }()   //小括弧不能省略
    await function(){
        return new Promise(resolve=>{
            console.log('data_P2:'+data)
            resolve('Done')
        })
    }() //小括弧不能省略
}
f()

3.重新用函数定义的方式定义p1和p2,代码如下(原来和方法2其实是一样的):

var data='0'
function p1(){
    return new Promise(resolve=>{
      console.log('data_p1:'+data)
      setTimeout(()=>{ 
          data='2'
          resolve('Done')
      }, 1000);
    })
}
function p2(){
    return new Promise(resolve=>{
       console.log('data_P2:'+data)
       resolve('Done')
    })
}
async function f(){
    console.log('data_f:'+data)
    data='1'
    await p1()
    await p2()
}
f()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值