asyn/await 的语法和使用

一、 async 函数

  • 函数的返回值为 promise 对象
  • promise 对象的结果由 async 函数执行的返回值决定
async function fn() {
  // return 1 返回一个成功的promise,值为 1
  // throw 2 返回一个失败的promise,值为 2
  // return Promise.reject(3) 返回一个失败的promise,值为 3
  return Promise.resolve(4) // 返回一个成功的promise,值为 4
}
const result = fn()
console.log(result)

二、 await 表达式

  • await 右侧的表达式一般为 promise 对象, 但也可以是其它的值
  • 如果表达式是 promise 对象, await 返回的是 promise 成功的值
  • 如果表达式是其它值, 直接将此值作为 await 的返回值
// 先定义一个fn1函数,它返回一个promise对象
function fn1() {
  return new Promise((resolve, reject) => {
    // 使用定时器来延迟promise的返回结果
    setTimeout(() => {
      resolve(6)
    }, 2000)
  })
}

// async函数会立即执行结束返回一个pending状态的promise对象
async function fn2() {
  /*
    await后面的代码会放入then()的成功回调中执行的
      const result = await fn3()
      console.log(result)
      相当于
      fn3().then(result=>{
         console.log(result)
      })
  */
  const result = await fn3()
  console.log(result)
}

三、注意:

  • await 必须写在 async 函数中, 但 async 函数中可以没有 await
  • 如果 await 的 promise 失败了, 就会抛出异常, 需要通过 try…catch 来捕获处理
async function fn1() {
  throw 6
}

async function fn2() {
  try {
    // 使用try...catch来处理await后的promise的失败
    const result = await fn1()
    console.log('fn1 result=', result)
  } catch (error) {
    console.log('error', error)
  }
}

fn2()

四、async/await、promise、ajax 结合使用

// ajax函数接收请求地址
function ajax(url) {
  // 返回一个promise对象
  return new Promise((resolve, reject) => {
    // 创建ajax对象
    const xhr = new XMLHttpRequest()
    // 监听xhr状态改变
    xhr.onreadystatechange = function () {
      // 状态为4表示数据全部请求回来了
      if (xhr.readyState === 4) {
        // 状态在200-300之间表示成功
        if (xhr.status >= 200 && xhr.status < 300) {
          // 执行resolve函数,并保存请求过来的数据,封装到data属性中
          resolve({ data: xhr.responseText || xhr.responseXML })
        } else {
          // 执行reject函数
          reject({ status: xhr.status, msg: '请求失败咯!' })
        }
      }
    }
    // 发送请求
    xhr.open('get', url)
    // 发送
    xhr.send()
  })
}
// 测试函数
async function test() {
  // await表达式必须写在async函数中
  const res = await ajax('http://localhost:3000/test_get?name=kobe&age=42')
  console.log(res) // {data: "{"msg":"请求成功!","data":{"name":"kobe","age":"42"},"status":1}"}
}
test()

相关文章

手写 Promise
原生 ajax 封装

async和awaitJavaScript中用于处理异步操作的关键字。async用于定义一个异步函数,而await用于等待一个异步操作的结果。 引用\[1\]中的代码展示了async和await的用法。在async函数中,使用await关键字可以暂停函数的执行,等待一个Promise对象的结果返回。在这个例子中,test函数返回一个Promise对象,await关键字等待这个Promise对象的结果返回后,才会继续执行后面的代码。所以在result函数中,console.log(value)会在test函数的结果返回后才会执行。 引用\[2\]中提到,await命令必须配合async函数使用。如果单独使用await命令会报错。正常情况下,await命令后面是一个Promise对象,它会等待这个Promise对象的结果返回。如果不是Promise对象,就直接返回对应的值。 引用\[3\]中的代码展示了await表达式不是Promise对象的情况。在这个例子中,foo函数使用setTimeout模拟了一个异步操作,它并不返回一个Promise对象。在bar函数中,使用await关键字等待foo函数的结果,但是由于foo函数不是Promise对象,所以await关键字并不会暂停函数的执行,而是直接执行后面的代码。 所以,async和await是用于处理异步操作的关键字,可以让异步代码以同步的方式编写和执行。但是需要注意的是,await关键字必须在async函数中使用,并且它后面的表达式必须是一个Promise对象。 #### 引用[.reference_title] - *1* *2* [async和await用法](https://blog.csdn.net/qq_72760247/article/details/127237856)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [ES7新特性 asyn与await](https://blog.csdn.net/wuyujin1997/article/details/89301825)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值