async 和 await

2023-10-31

async

  • async是一个加在函数前面的修饰符
  • async修饰的函数会默认返回一个promise对象,可以使用then方法添加回调函数
  • 返回的promise对象的结果是由async函数执行的返回值的结果来决定的

1、当async函数内部返回的是一个非promise对象时,则该返回的值会成为then方法中的回调函数的参数

async function fnOne() {
  return 521
}
fnOne().then(res => {
  console.log(res)
})
console.log(fnOne());

在这里插入图片描述

2、 当async函数内部抛出错误时,会将返回的promise对象的状态改变为reject。而抛出的错误不仅可以使用then方法的第二个回调函数接收到也可以被catch方法中的回调函数所接收到

async function fn() {
  throw new Error("出错了")
}

fn().then(
  res => console.log(res),
  rej => console.log(rej)
)
// 或者
// fn().catch(
//   v => console.log(v)
// )
console.log(fn());

在这里插入图片描述

3、当async函数内部返回的是一个promise对象并且该promise的结果为成功,则成功的值也会成为then方法中第一个回调函数中的参数

async function fn() {
  return new Promise((resolve, reject) => {
    resolve("成功")
  })
}

fn().then(
  res => console.log(res),
  rej => console.log(rej)
)
console.log(fn());

在这里插入图片描述

4、当async函数内部返回的是一个promise对象并且该promise的结果为失败,则失败的值会成为then方法中第二个回调函数中的参数,也会成为catch方法中回调函数的参数

async function fn() {
  return new Promise((resolve, reject) => {
    reject("失败")
  })
}

fn().then(
  res => console.log(res),
  rej => console.log(rej)
)
// 或者
// fn().catch(
//   v => console.log(v)
// )
console.log(fn());

在这里插入图片描述

await表达式

await 表达式

  • await必须写在async函数中,但是async函数中可以没有await

  • await的右侧表达式一般为promise对象,也可以是其他的值,它会返回该对象的结果

  • 如果await右侧的表达式为其他的值,则直接将该值作为await的返回值

async function fn() {

  return await 521
  // 等同于
  // return 521
}

fn().then(
  res => console.log(res),
  rej => console.log(rej)
)

console.log(fn());

在这里插入图片描述

  • 如果await右侧的表达式为promise对象并且该promise对象的结果是成功的,那么await会返回该promise对象成功的值,可以使用then方法来接收到该结果值
async function fn() {
  return await new Promise((resolve, reject) => {
    resolve("成功")
  })
}

fn().then(
  res => console.log(res),
  rej => console.log(rej)
)

console.log(fn());

在这里插入图片描述

  • 如果await右侧的表达式为promise对象并且该promise对象的结果是失败的,那么await会返回该promise对象失败的值,可以使用then方法,catch方法以及try...catch来捕获错误
async function fn() {
  // 使用trycatch方法
  try {
    return await new Promise((resolve, reject) => {
      reject("失败")
    })
  } catch (error) {
    console.log(error);
  }
}

// 或者then方法
// fn().then(
//   res => console.log(res),
//   rej => console.log(rej)
// )
// 或者catch方法
// fn().catch(
//   rej => console.log(rej)
// )

console.log(fn());

使用then方法和catch方法
在这里插入图片描述
使用try...catch方法:
在这里插入图片描述

  • 当async函数内部有多个await语句时,任何一个await语句后面promise对象变为reject状态,那么整个async函数就会中断,即后续的await函数将不会执行

例:

async function fn() {
  await Promise.reject("失败")
  await Promise.resolve("成功")   //不会执行
}

fn().then(
  res => console.log(res)
).catch(
  err => console.log(err)
)

console.log(fn());

在这里插入图片描述
当需要前一个await函数操作失败,也不要中断后续的await函数时,可以使用trycatch,将失败的await函数放入其中,这样不管前者的await函数操作是否成功,后续的await函数都将不会受到影响

async function fn() {
  try {
    await Promise.reject("失败")
  } catch (error) {
    console.log(error);
  }
  return await Promise.resolve("成功")
}

fn().then(
  res => console.log(res)
).catch(
  err => console.log(err)
)

console.log(fn());

另一种方法是await后面promise对象再跟一个catch方法,处理前面可能出现的错误

async function fn() {

  await Promise.reject("失败").catch(
    err => console.log(err)
  )
  return await Promise.resolve("成功")
}

fn().then(
  res => console.log(res)
).catch(
  err => console.log(err)
)

console.log(fn());

在这里插入图片描述

async与await结合发送Ajax

// 使用Promise来定义一个发送Ajax的方法
function setAjax(url) {
  return new Promise((resolve, reject) => {
    let xhr = new XMLHttpRequest();
    xhr.open('GET', url);
    xhr.send();
    xhr.onreadystatechange = function () {
      if (xhr.readyState === 4) {
        if (xhr.status >= 200 && xhr.status < 300) {
          resolve(xhr.response);
        } else {
          reject(xhr.status);
        }
      }
    }
  })
}

// 平常方式使用then方法和catch方法
// setAjax('https://api.apiopen.top/getJoke').then(data => {
//   console.log(data)
// }).catch(err => {
//   console.log(err)
// })


// 使用async和await方法
async function sendmsg() {
  return await setAjax('https://api.apiopen.top/getJoke')
}

sendmsg().then(
  data => console.log(data)
).catch(
  err => console.log(err)
)

成功:
在这里插入图片描述
失败:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

async 和 await 的相关文章

随机推荐

  • c语言 for循环 逗号,vs中for语句中的逗号怎么使用?

    Visual Studio 2015中的for循环语句还可以使用逗号 该怎么使用逗号呢 下面我们就来看看详细的教程 软件名称 Visual Studio 2015 简体中文正式版 企业版 软件大小 4 5GB更新时间 2016 09 17立
  • 针式打印机打印发虚_针式打印机打印输出字符模糊不清晰的原因有哪些

    针式打印机打印输出字符模糊不清晰的原因有哪些 针式打印机应用于发票和多联单据 如果打印效果出现模糊或者不清晰情况的话 所打印出来的发票和多联单据就会报废 这样就会出现耗材浪费 所以针式打印机输出字符模糊不清的时候 我们就应该找出引起故障原因
  • TCP和UDP详解

    文章目录 一 UDP协议 1 1 UDP协议报文格式 1 2 UDP协议的特点 1 3 扩展问题 二 TCP协议 2 1 TCP协议报文格式 2 2 什么是可靠性 2 2 1 确认应答机制 2 2 2 超时重传机制 2 2 3 连接管理机制
  • java eclipse 和 adt eclipse 去掉红色的波浪线以及错误语法提示

    windows gt perferences gt editors gt text editor gt annotation 在里面选择errors 把其中的三个选项都取消勾选 在里面选择c c indexer markers 把其中的三个
  • 前端代码规范

    文章目录 一 编程规约 一 命名规范 二 HTML 规范 Vue Template 同样适用 三 CSS 规范 四 LESS 规范 五 Javascript 规范 二 Vue 项目规范 一 Vue 编码基础 二 Vue 项目目录规范 前端代
  • 网络安全:XSS、CSRF、点击劫持、HTTPS加密(中间人攻击、DNS劫持)、泛洪攻击、SQL注入

    一 XSS攻击 什么是 XSS 攻击 XSS 全称是 Cross Site Scripting 即跨站脚本 为了和 CSS 区分 故叫它XSS XSS 攻击是指浏览器中执行恶意脚本 无论是跨域还是同域 从而拿到用户的信息并进行操作 这些操作
  • AMA: Yoshua Bengio (self.MachineLearning)

    Yoshua Bengio http www iro umontreal ca bengioy yoshua en index html is one of the machine learning professors who led t
  • 线上环境 CPU 使用率飙升如何快速排查?

    相比于一大堆复杂的 JVM 调优过程 本文介绍的排查步骤还是挺简单的 可以帮助各位小伙伴排查一些简单问题 面试官问起来也好过啥也不会 这个 CPU 打满如何排查我被问过好多次 模拟高 CPU 场景 这里就不麻烦地建 Web 项目了 用一个最
  • 上拉电阻和下拉电阻的作用详解

    一 定义 1 上拉就是将不确定的信号通过一个电阻嵌位在高电平 电阻同时起限流作用 下拉同理 2 上拉是对器件注入电流 下拉是输出电流 3 弱强只是上拉电阻的阻值不同 没有什么严格区分 4 对于非集电极 或漏极 开路输出型电路 如普通门电路
  • HTTP服务器实现(一)

    实现一个HTTP服务器就是实现一个程序可以接受客户端发送给服务器进程的请求消息 通过解析这些请求消息 做出相应的响应 下面我们先来梳理一下整体的思路 进行服务器的初始化 int init server char ip int port in
  • FPGA时序约束系列文章汇总

    时序约束在FPGA开发中起着非常关键的作用 与时序约束相关的方面包括时钟分析 路径分析 布线和布局优化等 时序约束的正确性和准确性对于设计的成功是至关重要的 因为它们对电路的时序性能 功耗和资源利用率有着重要影响 有效的时序约束可以帮助设计
  • UE4开发学习笔记(双人游戏共享视角,共享相机)

    先创建一个共享相机的actor类share camera 里面只要spring arm和camera就行 在关卡蓝图里设置摄像机位置 setviewtargetwithblend是将character本身的摄像机过渡到公共摄像机 这里的bl
  • 前端小白练习题查缺补漏2

    1 声明不是 HTML 标签 它是指示 web 浏览器关于页面使用哪个 HTML 版本进行编写的指令 声明没有结束标签 声明对大小写不敏感 2 end Math pow 2 50 111111 假设的值 var start end 100
  • duilib-自定义圆形按钮-环形进度条控件

    duilib 自定义圆形按钮 环形进度条控件 如何自定义一个圆形按钮控件内嵌到环形进度条底部 点击按钮刷新进度条值 类似下图 1 在UIDefine h中增加宏定义 define DUI CTR BTN PROGRESS T btnProg
  • sqli-labs(27)

    0X01 先查询闭合 id 1 报错 id 1 正确 知道是 的闭合语句 0X02那么开始我们的注入之旅 空格过滤了 尝试一下 0a绕过 也被过滤了 那么用and 1 1构造闭合 id 1 1 1 显示正确 我们来爆一下数据名称 哦豁 un
  • 产品经理工作积累(1)

    相比较做技术工作的人来说 做产品工作的更倾向于软能力 而这种软能力体现在个人的产品思想上 更或者说做产品的思维或理念 做产品除了本身的产品设计能力外 还有一点就是产品的思想 同一种产品不太的产品做出来后产品形态都会不同 特别是对于一些有独特
  • 在 Shell 脚本中调用另一个 Shell 脚本的三种方式

    先来说一下主要以下有几种方式 fork 如果脚本有执行权限的话 path to foo sh 如果没有 sh path to foo sh exec exec path to foo sh source source path to foo
  • android 反编译方法、工具介绍

    网上有很多的反编译文章 个人认为写的比较好的文章有 APK反编译得工具总结 转载 hayhx 博客园 我也是参考其文章来的 本人写此文章目的 以及反编译运用场景 主要有以下几方面 记录反编译的方法 方便自己用的时候比较方便 起到记录的作用
  • python词频统计_Python中文词频统计

    1 下载一长篇中文小说 2 从文件读取待分析文本 3 安装并使用jieba进行中文分词 pip install jieba import jieba ljieba lcut text import jieba txt open r piao
  • async 和 await

    async async是一个加在函数前面的修饰符 被async修饰的函数会默认返回一个promise对象 可以使用then方法添加回调函数 返回的promise对象的结果是由async函数执行的返回值的结果来决定的 1 当async函数内部