当前位置: 首页 > news >正文

Promise,async和js的事件循环机制

Promise

Promise有等待,已成功,失败,三种状态,状态的改变会触发then回调函数和catch回调函数。
当执行一个Promise时,它会立刻返回一个Promise对象,并且不会阻塞后续代码执行。

当Promise的状态发生改变后,相应的回调函数会被放入微任务队列。

Js的事件循环机制

通过js 的事件循环机制,从而执行promise以及DOM事件,Ajax请求,而不会阻塞。
js引擎的事件循环,使得js单线程的同时可以执行非阻塞任务。
流程如下:

while (true) {  // 执行同步任务()  while (stack.isNotEmpty()) {  executeSyncTask();  }  // 执行微任务队列的所有微任务  while (microtaskQueue.isNotEmpty()) {  executeMicrotask();  }  // 执行宏任务: 从宏任务中取出一个任务放入执行栈中执行。if (taskQueue.isNotEmpty()) {  macroTask = taskQueue.dequeue();  executeMacroTask(macroTask);  }  
}

同步任务:即主线程代码。

微任务:通常是用于处理Promise的回调函数(Promise的then和catch方法)。即当Promise的状态改变后,会将其回调函数放到微任务队列。

异步任务(宏任务):是由浏览器环境提供的任务,包括整体代码块,定时器,事件监听器,AJAX请求回调等。如果遇到异步任务,就将其添加到异步任务队列中。

async和awaite

async将函数标记为异步函数(异步函数就是返回值是Promise的函数)
Async func(){
const response=await fetch(“http://…”);//会等待fetch请求返回
const response=await fetch(“http://…”);//串行执行,等待第一个fetch执行完成后才执行

}
async func(){
const response1 =fetch(“http://…”)
const response2 =fetch(“http://…”)
const [a,b] = await Promise.all([response1,response2]);//会同步发起fetch请求,效率提高一倍
}

相关文章:

  • FPFA.一种二倍频电路代码描述以及测量详情
  • jar混淆,防止反编译,Allatori工具混淆jar包
  • springboot对接WebSocket实现消息推送
  • SpringBoot 3 集成Hive 3
  • 第十五节TypeScript 接口
  • 【MySQL】:超详细MySQL完整安装和配置教程
  • 【网络编程】基于UDP数据报实现回显服务器程序
  • 沉浸式go-cache源码阅读!
  • pytest 的 fixture 固件机制
  • 竞赛保研 基于RSSI的室内wifi定位系统
  • STM32软硬件CRC测速对比
  • Django之按钮(actions)
  • Linux服务器 部署飞书信息发送服务
  • 信息系统定级与等级测评的具体过程
  • 测试C#使用AForge从摄像头获取图片
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • Angular 响应式表单之下拉框
  • CentOS6 编译安装 redis-3.2.3
  • classpath对获取配置文件的影响
  • CSS魔法堂:Absolute Positioning就这个样
  • FastReport在线报表设计器工作原理
  • go append函数以及写入
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • Linux中的硬链接与软链接
  • Node项目之评分系统(二)- 数据库设计
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 分类模型——Logistics Regression
  • 前端学习笔记之观察者模式
  • 巧用 TypeScript (一)
  • 如何解决微信端直接跳WAP端
  • 使用common-codec进行md5加密
  • 一道闭包题引发的思考
  • 用jQuery怎么做到前后端分离
  • k8s使用glusterfs实现动态持久化存储
  • MPAndroidChart 教程:Y轴 YAxis
  • ​一些不规范的GTID使用场景
  • #13 yum、编译安装与sed命令的使用
  • #Z2294. 打印树的直径
  • #预处理和函数的对比以及条件编译
  • ${factoryList }后面有空格不影响
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (12)Hive调优——count distinct去重优化
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (3)(3.5) 遥测无线电区域条例
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (超详细)语音信号处理之特征提取
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (学习日记)2024.02.29:UCOSIII第二节
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)用.Net的File控件上传文件的解决方案