ES7新特性async/await详解

article/2025/9/2 10:00:54

一、async/await的用法

async用于修饰一个函数使函数返回一个Promise 对象。

async function testAsync() {return "hello async";
}const result = testAsync();
console.log(result);

在这里插入图片描述
await必须在用async修饰的函数中使用,await用于修饰一个语句,awit的返回值为该语句的值,如果awit修饰的语句为Promise 对象,它会阻塞后面的代码,等着 Promise 对象 resolve,然后得到 resolve 的值,作为 await 表达式的运算结果。

	async function async2() {return "async2"}function async3() {return new Promise(function(resolve) {resolve("async3")})}async function async1() {const v1 = await "async1";const v2 = await async2();const v3 = await async3();console.log(v1, v2, v3);}async1();//async1 async2 async3

二、async/await的作用

假设一个业务,分多个步骤完成,每个步骤都是异步的,而且依赖于上一个步骤的结果。如果用Promise 通过 then 链来解决需要多层回调,而用async/await在解决就容易很多

用promise实现

function takeLongTime(n) {return new Promise(resolve => {setTimeout(() => resolve(n + 200), n);});
}function step1(n) {console.log(`step1 with ${n}`);return takeLongTime(n);
}function step2(n) {console.log(`step2 with ${n}`);return takeLongTime(n);
}function step3(n) {console.log(`step3 with ${n}`);return takeLongTime(n);
}
function doIt() {console.time("doIt");const time1 = 300;step1(time1).then(time2 => step2(time2)).then(time3 => step3(time3)).then(result => {console.log(`result is ${result}`);console.timeEnd("doIt");});
}doIt();

用async/await实现

function takeLongTime(n) {return new Promise(resolve => {setTimeout(() => resolve(n + 200), n);});
}function step1(n) {console.log(`step1 with ${n}`);return takeLongTime(n);
}function step2(n) {console.log(`step2 with ${n}`);return takeLongTime(n);
}function step3(n) {console.log(`step3 with ${n}`);return takeLongTime(n);
}
async function doIt() {console.time("doIt");const time1 = 300;const time2 = await step1(time1);const time3 = await step2(time2);const result = await step3(time3);console.log(`result is ${result}`);console.timeEnd("doIt");
}doIt();

代码结构是不是清晰很多

三、async/await的执行顺序

阅读这篇需要对JS的执行顺序有深入的了解,如果有不懂的可以阅读我的这一篇博客:[由浅入深解释JS执行机制 EventLoop]
(https://blog.csdn.net/weixin_42210204/article/details/101942555)

await阻断后的任务属于微任务,放入微任务队列中

	console.log("start");async function async1() {console.log("async start");await console.log("await");console.log("async end");}async1();console.log("end");

依次输出 start->async start->await->end->async end
依次执行 到console.log(“await”);后遇到await,阻断await之后的任务,放入微任务列表,执行完所有宏任务后,在执行微任务列表里的console.log(“async end”);

	console.log("start");function as() {return new Promise(resolve => {console.log("as");resolve();}).then(function() {console.log("then");})}async function async1() {console.log("async start");await as();console.log("async end")}async1();new Promise(resolve => {console.log("promise");resolve();}).then(function() {console.log("then1")})console.log("end");

依次输出start->async start->as->promise->end->then->then1->async end

注意then1和async end的输出顺序,执行第一个微任务输出then后,遇见await又将console.log(“async end”)放入了微任务的队尾。
类似于以下这种情况:

	console.log("start");new Promise(resolve => {console.log("promise1");resolve();}).then(function() {console.log("then1");new Promise(resolve => {console.log("promise2");resolve();}).then(function() {console.log("then2");})})new Promise(resolve => {console.log("promise3");resolve();}).then(function() {console.log("then3");})console.log("end");

依次输出:start->"promise1->promise3->end->promise2->then3->then2


http://chatgpt.dhexx.cn/article/jXP7BHAS.shtml

相关文章

Elasticsearch 7新特性

Elasticsearch是一款强悍的分布式搜索和分析引擎,以下简称为ES,通过本文我简单介绍下ES7部分新特性,内容包括: 聚合查询的优化ES7中索引type被移除索引创建默认1个分片优化查询速度hits.total返回对象_flush和_force_merge不再强制…

ES7的新特性

1.新增了includes的数组查找方法 使用场景:确认数组中有我们需要查找的内容 在ES7之前,我们接触到的数组方法可以通过filter或者indexOf 如果使用filter 可以直接筛选之后输出,如果是indexOf则根据返回值来判断是否在当前数组中。 如果返回…

【Spring Cloud Alibaba】(二)微服务调用组件Feign原理+实战

系列目录 【Spring Cloud Alibaba】(一)微服务介绍 及 Nacos注册中心实战 本文目录 系列目录前言什么是RPC?Feign和OpenFeign都是什么?HTTP调用 vs Feign(RPC)调用单独使用Feign实战Feign核心源码解读Feign整体设计架构Spring Cl…

聊聊 Feign 的实现原理

What is Feign Feign 是⼀个 HTTP 请求的轻量级客户端框架。通过 接口 注解的方式发起 HTTP 请求调用,面向接口编程,而不是像 Java 中通过封装 HTTP 请求报文的方式直接调用。服务消费方拿到服务提供方的接⼝,然后像调⽤本地接⼝⽅法⼀样去…

简单谈谈Feign

简单谈谈Feign 文章目录 简单谈谈Feign前言Feign属于RPC嘛? 原理简单图解原理简述Feign.Build动态代理工厂InvocationHandlerFactory动态代理类FeignInvocationHandler方法处理器MethodHandler 总结 本文只是简单粗略的分析一下feign的源码与过程原理 前言 Feign是…

Feign 原理 (图解)

疯狂创客圈 经典图书 : 《Netty Zookeeper Redis 高并发实战》 面试必备 面试必备 面试必备 【博客园总入口 】 疯狂创客圈 经典图书 : 《SpringCloud、Nginx高并发核心编程》 大厂必备 大厂必备 大厂必备 【博客园总入口 】 入大厂涨工资 必备的 …

Feign详解与实例

基本介绍 Feign是一种负载均衡的HTTP客户端, 使用Feign调用API就像调用本地方法一样,从避免了调用目标微服务时,需要不断的解析/封装json 数据的繁琐。Feign集成了Ribbon。Ribboneureka是面向微服务编程,而Feign是面向接口编程。 Fegin是一个…

Feign使用和原理的总结

官方参考 https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/ 使用 引入依赖 <properties><java.version>1.8</java.version><spring-cloud.version>2021.0.1</spring-cloud.version></properties><depen…

Feign的介绍

Feign是springcloud里面的一个功能组件&#xff0c;那么它是实现一个什么功能呢&#xff1f; 首先我们可以先从字面意思上去理解一下它&#xff0c;Feign&#xff0c;英文翻译过来就是伪装的意思&#xff0c;实际上它的功能也是和伪装相关的&#xff0c;在我们之前在客户端配置…

FeignClient原理解读

FeignClient原理解读 简介源码解读feign负载ribbon源码解读eurake的ribbon原理是&#xff1a;调度原理&#xff1a; 笔记参考文献 简介 这一章节主要介绍feignClient的地址如何来&#xff0c;如何从feign Server注册中心寻址和调用。 源码解读 在解读源码之前&#xff0c;建…

Spring Cloud-Feign设计原理

什么是Feign&#xff1f; Feign 的英文表意为“假装&#xff0c;伪装&#xff0c;变形”&#xff0c; 是一个http请求调用的轻量级框架&#xff0c;可以以Java接口注解的方式调用Http请求&#xff0c;而不用像Java中通过封装HTTP请求报文的方式直接调用。Feign通过处理注解&am…

再学一下Feign的原理

简介 Feign是Spring Cloud Netflix组件中的一个轻量级Restful的HTTP服务客户端&#xff0c;它简化了服务间调用的方式。 Feign是一个声明式的web service客户端.它的出现使开发web service客户端变得更简单.使用Feign只需要创建一个接口加上对应的注解, 比如FeignClient注解。…

Feign的底层原理

Feign的底层原理 1 EnableFeignClients2 根据接口上的注解创建RequestTemplate3 发送请求 1 EnableFeignClients 这个注解标注在springboot的启动类上,作用是开启feign接口扫描 FeignClientsRegistrar.registerFeignClients()扫描被FeignClient标识的接口生成代理类 public vo…

深入理解Feign之源码解析

转载请标明出处&#xff1a; https://blog.csdn.net/forezp/article/details/73480304 本文出自方志朋的博客 出自方志朋的博客 个人博客纯净版&#xff1a;https://www.fangzhipeng.com/springcloud/2017/08/11/sc-feign-raw.html 什么是Feign Feign是受到Retrofit&#xff…

SpringCloud 中Feign原理(图解)

1 SpringCloud 中Feign原理 1.1 Feign简介 Feign是Netflix公司开源的轻量级rest客户端&#xff0c;使用Feign可以非常方便的实现Http 客户端。Spring Cloud引入Feign并且集成了Ribbon实现客户端负载均衡调用。 1.2 Feign远程调用的基本流程 Feign远程调用&#xff0c;核心就是…

Feign(简介和使用)

1. Feign介绍 通过RestTemplate调用其它服务的API时&#xff0c;所需要的参数须在请求的URL中进行拼接&#xff0c;如果参数少的话或许我们还可以忍受&#xff0c;一旦有多个参数的话&#xff0c;这时拼接请求字符串就会效率低下 Feign是一个声明式的Web Service客户端&#…

什么是Feign?

服务间调用介绍 现有的服务调用方式 利用拼接的方式。 虽然上面有的用不错就很好了 Feign解决了什么问题 Feign的调用方式 Feign体系架构解析-武装到牙齿 上一节我们了解了feign的主要功能&#xff0c;它就像一个自拍杆一样&#xff0c;方便了Eureka的远程调用。可是怎么看…

Feign 的实现原理

Feign 实现原理 Feign是申明式的 HTTP 客户端。代码中创建一个接口并加上FeingClient 注解即可使用。其底层封装了 HTTP 客户端构建并发送的复杂逻辑。同时也可以整合注册中心及 Ribbon 为其提供负载均衡能力&#xff1b;通过整合 Histrix/sentinal 实现熔断限流功能。本期主要…

OpenFeign的实现原理(附Feign和OpenFeign的区别)

目录 问题现象&#xff1a; 问题分析&#xff1a; 拓展&#xff1a; 1、Feign&#xff1a; 2、OpenFeign&#xff1a; 问题现象&#xff1a; 最近在复习SpringCloud的时候看到一个面试题&#xff1a; OpenFeign的实现原理&#xff1f; 问题分析&#xff1a; OpenFeign是Sp…

Feign原理

是一个HTTP请求调用轻量级框架&#xff0c;可以以Java接口注解的方式调用HTTP请求&#xff0c;而不用像Java中通过封装HTTP请求报文的方式直接调用。 Feign解决了什么问题 在服务调用的场景中&#xff0c;我们经常调用基于HTTP协议的服务&#xff0c;而我们经常使用到的框架可…