什么是await
- await 可以和 promise 一起用
- await 可以使异步函数更像同步函数
async await的用法
我们可以写一个简单的promise函数
const 猜大小 = (x) => {
return new Promise((resolve, reject)=>{
setTimeout(()=>{
const n = parseInt(Math.random(),10) + 1
if( n < 3 ){
if( x === '大'){
reject(n)
}else{
resolve(n)
}
}
if( n > 3 ){
if( x === '大' ){
resolve(n)
}else{
reject(n)
}
}
},1000)
})
}
- 使用then调用
猜大小('大')
.then(
(x)=>{console.log(x)},
()=>{console.log('err')}
)
- 使用await
const test = async function (){
try {
let n = await 猜大小('大')
console.log(n)
}catch (err){
console.log('err')
}
}
test()
以上两种方法都可以调用Promise
- 使用await时,需要在函数前面写上async来表明它是一个异步函数
- 使用await时,后面需要接一个Promise,等Promise执行完毕后才会赋给n
使用await的好处
使用await的好处在于可以方便我们阅读代码 当我们仅仅调用一次then时,我们会觉得then更方便,但是当我们在then之后在多次调用then时,就出现问题了
Promise.then(f1,f2).then(f3,f4)
上面的代码表示
- f1 或者 f2 执行成功,调用f3
- f1 或者 f2 执行失败,调用f4
当我们再次then,就会发现事情变得复杂了。
Promise.then(f1,f2).then(f3,f4).then(f5,f6)
如果我们使用await,那么只会有 try catch 两个分支,阅读更方便。
有多个Promise时该怎么办
- 使用Promise.all / promise.race 配合 then
- 使用Promise.all / promise.race 配合 await 上面说了,await后面需要接一个Promise,那么Promise.all就符合条件了
const test = async function (){
try {
let n = await Promise.all([f1,f2])
console.log(n)
}catch (err){
console.log('err')
}
}
test()