asyn/await 的语法和使用

码影启航者
• 阅读 1008

一、 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 封装

点赞
收藏
评论区
推荐文章
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
郜小超 郜小超
4年前
用 async/await 来处理异步
一级标题昨天看了一篇vue的教程,作者用async/await来发送异步请求,从服务端获取数据,代码很简洁,同时async/await已经被标准化,是时候学习一下了。先说一下async的用法,它作为一个关键字放到函数前面,用于表示函数是一个异步函数,因为async就是异步的意思,异步函数也就意味着该函数的执行不会阻塞后面代码的执行。写一个async
Karen110 Karen110
4年前
盘点JavaScript中async/await知识
大家好,我是进阶学习者。一、前言Async/await是以更舒适的方式使用promise的一种特殊语法,同时它也非常易于理解和使用。二、Asyncfunction让以async这个关键字开始。它可以被放置在一个函数前面。如下所示:asyncfunctionf()return1;在函数前面的“async”这个单词表达了一个简单的
Chase620 Chase620
4年前
Promise从入门到拿Offer之手写Promise
1、Promise构造函数的实现Promise构造函数用来声明示例对象,需要传入一个执行器函数。其中包括resolve函数和reject函数,以及几个重要的属性:状态属性、结果属性和回调函数队列。构造函数的基本框架resolve函数用于异步处理成功后调用的函数。其中包括验证对象状态修改次数,修改promise实例对象状态,异步调用成功的回调函数
Bill78 Bill78
4年前
Python多进程 - 实现多进程的几种方式
方式一:os.fork()coding:utf8"""pidos.fork()1.只用在Unix系统中有效,Windows系统中无效2.fork函数调用一次,返回两次:在父进程中返回值为子进程id,在子进程中返回值为0"""importospidos.fork()ifpid0:
Wesley13 Wesley13
4年前
mysql中时间比较的实现
MySql中时间比较的实现unix\_timestamp()unix\_timestamp函数可以接受一个参数,也可以不使用参数。它的返回值是一个无符号的整数。不使用参数,它返回自1970年1月1日0时0分0秒到现在所经过的秒数,如果使用参数,参数的类型为时间类型或者时间类型的字符串表示,则是从1970010100:00:0
Stella981 Stella981
4年前
JS 对象数组Array 根据对象object key的值排序sort,很风骚哦
有个js对象数组varary\{id:1,name:"b"},{id:2,name:"b"}\需求是根据name或者id的值来排序,这里有个风骚的函数函数定义:function keysrt(key,desc) {  return function(a,b){    return desc ? ~~(ak
Stella981 Stella981
4年前
HIVE 时间操作函数
日期函数UNIX时间戳转日期函数: from\_unixtime语法:   from\_unixtime(bigint unixtime\, string format\)返回值: string说明: 转化UNIX时间戳(从19700101 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式举例:hive   selec
Promise规范与原理解析 | 京东物流技术团队
Promise对象用于清晰的处理异步任务的完成,返回最终的结果值,本次分享主要介绍Promise的基本属性以及Promise内部的基础实现,能够帮我们更明确使用场景、更快速定位问题。
Promise规范与原理解析
作者:京东物流孙琦摘要Promise对象用于清晰的处理异步任务的完成,返回最终的结果值,本次分享主要介绍Promise的基本属性以及Promise内部的基础实现,能够帮我们更明确使用场景、更快速定位问题。Promise出现的原因首先我们先来看一段代码:异步