我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JavaScript中async和await的使用及队列详情

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JavaScript中async和await的使用及队列详情

一、宏任务和微任务的队列入门知识,可以参考之前的文章:

[JavaScript的事件循环机制]

宏任务和微任务在前端面试中,被经常提及到,包括口头和笔试题

1.async && await概念

async:

  • 使用async关键字声明的函数,是AsyncFunction构造函数的实例,在async函数体内,可以使用await接收promise实例
  • async和await关键字,在开发过程中,可以简洁地去做一些异步操作。

await:

  • await操作符接受一个Promise 对象,并且只能和异步函数async function搭配使用。
  • await 表达式会暂停当前 async function 的执行,等待 Promise 处理完成。
  • 若 Promise 正常处理 (fulfilled),其回调的 resolve 函数参数作为 await 表达式的值,继续执行
  • 若 Promise 处理异常 (rejected),await 表达式会把 Promise 的异常原因抛出。
  • 如果 await 操作符后的表达式的值不是一个 Promise,则返回该值本身。

2.async && await基本使用


// 模拟请求接口
function userInfo() {
	return new Promise((resolve) => {
		setTimeout(() => {
			resolve("zhangsan");
		}, 2000);
	});
}

// 接收请求的返回值
async function fetchUserInfo() {
	let res = await userInfo();
	console.log(res);
}
fetchUserInfo(); // zhangsan

// 不是异步promise
let testFn = function test(){}
async function notPromise() {
	var str = await testFn;
	console.log(str); // function test(){}
}
notPromise();

二、async&& await结合promise在面试时回遇到的队列问题

function userInfo() {
	return new Promise((resolve) => {
		setTimeout(() => {
			resolve(`接口返回值---------------1`);
		}, 2000);
	});
}

console.log("1");
let p1 = new Promise((resolve, reject) => {
	resolve("p1");
});
let p2 = new Promise((resolve, reject) => {
	resolve("p2");
});
async function getUserInfo() {
    console.log("2");
    
    p1.then((res) => {
    	console.log(res);
    });
    var awaitRes = await userInfo();
    console.log(awaitRes); // 接口返回值---------------1
    
    p2.then((res) => {
    	console.log(res);
    });
    
    console.log("3");
}
console.log("4");
getUserInfo(); // 异步方法,加入任务队列执行
console.log("5");

  • 同步任务1,4,执行
  • getUserInfo作为异步方法,优先执行同步代码2
  • p1和userInfo方法,p2这三个作为promise会放在异步队列当中,并且await后面的代码会阻塞后续的代码执行,因此3也会作为异步任务,放在await之后执行
  • 此时,会先执行5
  • 所有的同步代码执行完成之后,从队列中,执行异步任务,p1,awaitRes---->接口返回值---------------1
  • 到这里值得注意的是,由于await会阻塞同步代码的执行,因此await执行完成之后,会先执行在它之后阻塞的同步代码,执行完成之后,才会执行p2这个promise异步任务

所以整个代码块执行的顺序是:

1,4,2,5,p1,接口返回值---------------1,3,p2

三、总结

async和await作为ecmascript的新特性,目前更多的场景使用在前端获取后端接口和进行一些异步操作等。

到此这篇关于JavaScript中async和await的使用及队列详情的文章就介绍到这了,更多相关JavaScript中async和await内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

JavaScript中async和await的使用及队列详情

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

JS中的async与await异步编程及await使用陷阱

这篇文章主要介绍了async与await异步编程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-03-24

es7中的async、await使用方法示例详解

async、await是es7里面的新语法,async申明一个function是异步,而await等待一个异步方法执行完成。替代promise中的then。async函数返回一个Promise对象,当函数执行的时候,一旦遇到await就会先返回,等到触发的异步操作完成,再接着执行函数体内后面的语句。
2023-01-28

JS中的async与await异步编程及await使用陷阱源码分析

这篇“JS中的async与await异步编程及await使用陷阱源码分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“JS中
2023-07-05

Vue 中 Promise 的then方法异步使用及async/await 异步使用总结

then 方法是 Promise 中 处理的是异步调用,异步调用是非阻塞式的,在调用的时候并不知道它什么时候结束,也就不会等到他返回一个有效数据之后再进行下一步处理,这篇文章主要介绍了Vue 中 Promise 的then方法异步使用及async/await 异步使用总结,需要的朋友可以参考下
2023-01-12

详解RabbitMQ延迟队列的基本使用和优化

这篇文章主要介绍了详解RabbitMQ延迟队列的基本使用和优化,延迟队列中的元素都是带有时间属性的。延迟队列就是用来存放需要在指定时间被处理的元素的队列,需要的朋友可以参考下
2023-05-19

flutter中的JSON和序列化方法及使用详解

这篇文章主要为大家介绍了flutter中的JSON和序列化方法及使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-01-12

Python中的堆和优先队列的使用场景有哪些?

Python中的堆和优先队列的使用场景有哪些?堆是一种特殊的二叉树结构,常用于高效地维护一个动态的集合。Python中的heapq模块提供了堆的实现,可以方便地进行堆的操作。优先队列也是一种特殊的数据结构,不同于普通的队列,它的每个元素都有
Python中的堆和优先队列的使用场景有哪些?
2023-10-28

script标签中的async和defer详细说明与使用场景

这篇文章主要介绍了script标签中的async和defer详细说明与使用场景,需要的朋友可以参考下
2023-02-18

Golang中使用RabbitMQ实现消息队列的原理和实践

在Golang中使用RabbitMQ实现消息队列的原理和实践主要涉及以下几个方面:1. RabbitMQ介绍:RabbitMQ是一个开源的消息队列中间件,它基于AMQP(Advanced Message Queuing Protocol)协
2023-10-08

Python中的队列和栈的实现方式和使用场景有哪些?

Python中的队列和栈的实现方式和使用场景有哪些?队列和栈是数据结构中常用的两种数据类型,它们分别具有不同的特性和使用场景。Python提供了多种实现方式来创建和操作队列(Queue)和栈(Stack)的数据结构。队列的实现方式:1.1
2023-10-22

队列的数据结构和原理及其在PHP与MySQL中的应用

引言队列是一种常见的数据结构,它基于先进先出(FIFO)的原则,既可以用于存储和检索数据,也可以在并发环境中实现任务调度。在本文中,我们将探讨队列的基本原理和数据结构,并举例说明它在PHP与MySQL中的应用。队列的原理队列是一种线性数据结
2023-10-21

编程热搜

目录