async是在声明一个异步函数,而await是在等待一个异步方法的执行

async函数

这个函数总是返回一个promise,如果代码中有return <非promise>语句,JavaScript会自动把返回的这个value值包装成promise的resolved值。

  1. async function foo(){
  2. return 1
  3. }
  4. console.log(foo())

捕获.PNG

await

关键词await可以让JavaScript进行等待,直到一个promise执行并返回它的结果,JavaScript才会继续往下执行。

  1. async function f() {
  2. let promise = new Promise((resolve, reject) => {
  3. setTimeout(() => resolve('done!'), 1000)
  4. })
  5. let result = await promise // 直到promise返回一个resolve值(*)
  6. alert(result) // 'done!'
  7. }
  8. f()

async函数处理异常

通过catch来捕获异常

  1. async function foo(){
  2. throw new Error('fail')
  3. }
  4. foo().catch(err=>{
  5. console.log(err)
  6. })

在async函数内部使用try-catch来处理异常和错误

  1. async function foo(){
  2. try{
  3. await new Promise((res,rej)=>{
  4. rej('fail')
  5. })
  6. }catch(err){
  7. console.log(err)
  8. }
  9. }
  10. foo()

class和await结合

class类中有then函数会被包装成promise函数

  1. class User{
  2. then(res,rej){
  3. res('success)
  4. }
  5. }
  6. async function foo(){
  7. let a = await new User()
  8. return a
  9. }
  10. foo().then(v=>console.log(v))

async函数并行执行

利用Promise.all来实现

  1. async function foo(){
  2. let h1 = new Promise((res,rej)=>{
  3. setTimeout(()=>res('h1'),2000)
  4. })
  5. let h2 = new Promise((res,rej)=>{
  6. setTimeout(()=>res('h2'),2000)
  7. })
  8. let result = await Promise.all(h1,h2)
  9. }
  10. foo()