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

195

被折叠的 条评论
为什么被折叠?



