写在前面

在使用 Promise 的 then 方法对异步操作结果进行处理时是通过回调的方式进行处理的,无法得知回调函数是什么时候执行的,相比于同步操作的可以看得到的结果处理,异步操作的结果处理让代码不是那么好懂。于是在 ES2017,也就是 ES8 标准中,增加了 async 和 await 的用法,目的在于使得异步函数的执行更像同步函数,让异步操作向同步操作靠近。

1. 不使用 async / await 的异步操作

  1. function 摇筛子(){
  2. return new Promise((resolve, reject)=>{
  3. setTimeout(()=>{
  4. let n = parseInt(Math.random() * 6 + 1,10)
  5. if(n > 3){
  6. resolve(n)
  7. }
  8. else{
  9. reject("你输了")
  10. }
  11. },1000)
  12. })
  13. }
  14. 摇筛子().then((data)=>{
  15. console.log(data)
  16. },(error)=>{
  17. console.log(error)
  18. })

2. 使用 async / await 的异步操作

  1. function 摇筛子(){
  2. return new Promise((resolve, reject)=>{
  3. setTimeout(()=>{
  4. let n = parseInt(Math.random() * 6 + 1,10)
  5. if(n > 3){
  6. resolve(n)
  7. }
  8. else{
  9. reject("你输了")
  10. }
  11. },1000)
  12. })
  13. }
  14. async function test(){
  15. try{
  16. let n = await 摇筛子()
  17. console.log(n)
  18. }catch(error){
  19. console.log(error)
  20. }
  21. }
  22. test()

await 后面接一个 Promise 对象,返回该对象的结果,如该对象的结果为成功,则返回成功的值data,若该对象的结果为失败,则会返回一个错误,可用 try / catch 捕获这个错误进行查看。如果不是 Promise 对象,就直接返回对应的值。并且,await 关键字必须用在 async 函数中才不会报错。

async 的用法是在普通函数前加关键字 async ,用来定义该函数是一个异步函数,其调用的结果是返回一个 Promise 对象。用 async 定义的异步函数可以包含 await 指令,该指令会暂停异步函数的执行,并等待Promise执行,然后继续执行异步函数,并返回结果。

在 async 函数内部使用 await 得到异步操作的结果,在得到结果后对结果进行处理,得到结果和处理结果是同步的,这样一来,使用 async / await ,在 async 函数内部是同步执行的。