async和await的讲解

2023-11-02

async和await的讲解

声明async函数的几个方法

普通的函数声明

async function A(){}

声明一个函数表达式

let A=async function(){}

async形式的箭头函数

let A=async ()=>{}

初识async和await

async与await实例应用,基础代码
控制器调用与server中查询数据

exports.getBlogList =async (ctx,next)=>{
return ctx.body = await ArticleServer.getBlogListServer();
}


exports.getBlogListServer= async ()=>{
let where={
id:'1'
}
let blogList= await articleBlogDa.findAll({where:where});
console.log("哈哈哈"+blogList);
return  blogList;
}

  1. 方法执行后的返回值:await命令后面对应的是Promise对象或值,如果是值,就会转到一个立即resolve的Promise对象。async函数返回的是一个Promise对象,如果结果是值,会经过Promise包装返回。

  2. await与并行:如果在一个async的方法中,有多个await操作的时候,程序会变成完全的串行操作,一个完事等另一个但是为了发挥node的异步优势,当异步操作之间不存在结果的依赖关系时,可以使用promise.all来实现并行,all中的所有方法是一同执行的。

  3. 执行后的结果:async函数中,如果有多个await关键字时,如果有一个await的状态变成了rejected,那么后面的操作都不会继续执行,promise也是同理await的返回结果就是后面promise执行的结果,可能是resolves或者rejected的值使用场景循环遍历方便了代码需要同步的操作(文件读取,数据库操作等)

asyncawait一些注意关键点小结

  • await关键字必须位于async函数内部
  • await关键字后面需要一个promise对象(不是的话就调用resolve转换它)
  • await关键字的返回结果就是其后面Promise执行的结果,可能是resolved或者rejected的值,注意最后执行完的是个值
  • 不能在普通箭头函数中使用await关键字,需要在箭头函数前面添加async
  • await用来串行的执行异步操作,现实现并行可以考虑promise.all

async与await缺点

async函数中,如果有多个await关键字时,如果有一个await的状态变成了rejected,那么后面的操作都不会继续执行,promise也是同理有这样一个函数async

function getData()
{
let value=await get();
value++;
await set();//set完成后返回数据
return value;
    
}

直接调用

var value=getData();

是对于这个函数直接调用的时候并不是你想要的返回值,因为async方法返回的永远是一个promise,即使开发者返回的是一个常量,也会被自动调用的promise.resolve方法转换为一个promise。因此对于这种情况,上层调用方法也需要是async函数,采用如下方法

async function xxxx(){
var value=await getData();
return value;
}

对于这种调用,如果还存在更高层次的方法调用,那么从底层的异步操作开始,一直到最顶层一个不需要返回值的函数为止,全部的方法都要变成async

文章首发于公众号: 『 程序员成长指北 』 ,如果想要学习更多前端开发技能, 请关注公众号, 和作者一起学习.

我知道你在看,你的 点赞 + 评论 + 关注 是我继续写文章的动力

在这里插入图片描述

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

async和await的讲解 的相关文章

随机推荐

  • Activity启动源码分析

    我会思考的是 activity的启动过程是什么样的呢 是什么原理呢 有哪些好的地方 哪些不好的地方呢 可不可以更好呢 首先 是会执行到startActivityForResult 然后会执行Instrumention的execStartAc
  • GDB调试-小试牛刀

    This is the GNU debugger Usage gdb options executable file core file or process id gdb options args executable file infe
  • vue自定义组件+Dialog 对话框组件定制弹出框教程

    1 新建一个 vue页面 写一个Dialog组件 把弹出框上想要展示的内容放进去
  • 学习笔记(97):R语言入门基础-pairs绘图

    立即学习 https edu csdn net course play 24913 285841 utm source blogtoedu pairs函数 m matrix 1 16 nrow 4 pairs m 对应结果 df data
  • prettier 配置

    使用 VS Code 开发的时候会配合 prettier 来进行代码格式化 这里贴出一份 prettier 配置 所有的配置都是默认配置 注释中也有表明相关的网站 options 是使用 google 翻译的 可能有翻译的不准确的地方 不过
  • 使用tensorflow训练模型时可能出现nan的几种情况

    最近在做基于MTCNN的人脸识别和检测的项目 在训练模型的过程中总是会不定时地出现损失值为nan的情况 Debug了好久终于找到了问题所在 这里总结以下可能出现nan的几种情况 1 在分类问题中 我们经常使用到交叉熵损失函数 需要注意的是
  • thymeleaf加载数据失败

    在使用thymeleaf进行传送模型数据的时候 发现只有return数据 没有对应的页面 后台代码如下 前端代码如下 应该将 RestController 改成 Controller 测试成功 原因 如果使用 RestController注
  • idea如何开启Run Dashboard

    1 使用场景 IDEA开发工具中以 run 或 debug 方式启动多个 SpringBoot 应用时 日志控制台排开在窗口上方 服务间调用涉及日志追踪时 不方便快速切换来查看日志信息 如下图所示 IDEA提供了强大Dashboard功能
  • css的层叠顺序

    css中用z index来控制定位元素的层叠顺序 z index integer auto 整数值越大 元素离我们越近 一旦给一个定位元素设定了z index的值 不是auto 那么它就为它的所有后代建立了一个新的局部层叠上下文 如
  • Kafka系统学习

    Kafka学习视频 文章目录 一 Kafka 概述 二 消息队列 传统消息队列的应用场景 使用消息队列的好处 消息队列的 两种模式 三 Kafka 基础架构 四 Docker安装 Kafka Kafka命令行 六 Kafka架构深入 Kaf
  • VMware Pro下Centos 8虚拟机网络配置与克隆

    网络配置对于小白来讲是非常麻烦的 所以针对VMware Pro下的虚拟机网络配置进行记录 另外也会记录一下克隆虚拟机的一个过程 这个对测试集群的部署是非常有用的 注意一定是VMware Pro 因为Player免费版无网络配置功能 环境安装
  • 浪潮服务器更换硬盘_浪潮K1 Power E950百万豪机拆机指南

    不久前 浪潮商用机器一位架构师背着老板把浪潮K1 Power Linux服务器给 解剖 了 但是有网友质疑说顶多算半个拆机 不过瘾 安排 不过这次拆的可是价值百万的豪华机型 浪潮K1 Power E950 价值百万可不是随口说说 不信 看基
  • 数据库——MYSQL复习

    单表查询 1 查询指定列 select id name from t student 2 查询全部列 select from t student 3 查询经过计算的值 select id age 18 from t student 4 消除
  • 接口测试持续集成详解

    一 持续集成概述 1 持续集成简介 持续集成 Continuous Integration 简称CI 是一种软件开发实践 即团队开发成员经常集成他们的工作 通常每个成员每天至少集成一次 也就意味着每天可能会发生多次集成 持续集成的目的 让产
  • eclipse 找不到或无法加载主类 ClassNotFoundException

    项目右键 Builde path gt Configure Build Path gt
  • 02 编程语言与Python介绍

    编程语言与Python介绍 一 引子 二 编程语言分类 2 1 机器语言 2 2 汇编语言 2 3 高级语言 2 3 1 编译型 如C语言 2 3 2 解释型 如python 2 4 总结 三 Python介绍 3 1 Python解释器的
  • springboot系列 @ComponentScan和@EnableAutoConfiguration的区别

    研究springboot源码 在网上看相关博客的时候对 ComponentScan和 EnableAutoConfiguration两者之间的作用没有做过多的区分 导致我觉得他们两者都有扫描相关组建然后将符合要求的放入到ioc容器中 所以我
  • 接口MD5签名校验工具类

    签名算法过程 1 对除签名外的所有请求参数按key做ASCII升序排列 value无需编码 假设当前时间的时间戳是12345678 例如 有c 3 b 2 a 1 三个参 另加上时间戳后 按key排序后为 a 1 b 2 c 3 times
  • 安装启动引导器的设备(Device for boot loader installation):

    选择sdXY 第一个X是一个字母 表示磁盘个数 第二个Y是一个阿拉伯数字 代表分区 的那一项 也就是说 要将启动引导器安装在 分区中 dev xyzn dev 这个字串是所有设备文件所在的目录名 因为分区在硬盘上 而硬盘是设备 所以这些文件
  • async和await的讲解

    async和await的讲解 声明async函数的几个方法 普通的函数声明 async function A 声明一个函数表达式 let A async function async形式的箭头函数 let A async gt 初识asyn