写在前面
在使用 Promise 的 then 方法对异步操作结果进行处理时是通过回调的方式进行处理的,无法得知回调函数是什么时候执行的,相比于同步操作的可以看得到的结果处理,异步操作的结果处理让代码不是那么好懂。于是在 ES2017,也就是 ES8 标准中,增加了 async 和 await 的用法,目的在于使得异步函数的执行更像同步函数,让异步操作向同步操作靠近。
1. 不使用 async / await 的异步操作
function 摇筛子(){
return new Promise((resolve, reject)=>{
setTimeout(()=>{
let n = parseInt(Math.random() * 6 + 1,10)
if(n > 3){
resolve(n)
}
else{
reject("你输了")
}
},1000)
})
}
摇筛子().then((data)=>{
console.log(data)
},(error)=>{
console.log(error)
})
2. 使用 async / await 的异步操作
function 摇筛子(){
return new Promise((resolve, reject)=>{
setTimeout(()=>{
let n = parseInt(Math.random() * 6 + 1,10)
if(n > 3){
resolve(n)
}
else{
reject("你输了")
}
},1000)
})
}
async function test(){
try{
let n = await 摇筛子()
console.log(n)
}catch(error){
console.log(error)
}
}
test()
await 后面接一个 Promise 对象,返回该对象的结果,如该对象的结果为成功,则返回成功的值data,若该对象的结果为失败,则会返回一个错误,可用 try / catch 捕获这个错误进行查看。如果不是 Promise 对象,就直接返回对应的值。并且,await 关键字必须用在 async 函数中才不会报错。
async 的用法是在普通函数前加关键字 async ,用来定义该函数是一个异步函数,其调用的结果是返回一个 Promise 对象。用 async 定义的异步函数可以包含 await 指令,该指令会暂停异步函数的执行,并等待Promise执行,然后继续执行异步函数,并返回结果。
在 async 函数内部使用 await 得到异步操作的结果,在得到结果后对结果进行处理,得到结果和处理结果是同步的,这样一来,使用 async / await ,在 async 函数内部是同步执行的。