js 同步与异步

news2024/9/23 16:23:08

一、js 执行机制

JavaScript语言的一大特点就是单线程,即(同一时间只能做一件事情)。因为JavaScript是为了处理页面中用户的交互,以及操作DOM而诞生的。比如对某个DOM元素进行添加和删除操作。不能同时进行,应该先进行添加,再进行删除。

单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。这样所导致的问题是∶如果JS执行的时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞的感觉。所以HTML5提出Web Worker标准,允许JavaScript脚本创建多个线er程,于是,js中出现了 同步 异步

二、同步和异步

同步任务:前一个任务结束后再执行后一个任务,程序的执行顺序与任务的排列顺序是一致的。

异步任务:多任务多线程,比如:做一件事的同时,可以去做其他事情。

解释:

同步任务都在主线程上执行,形成一个执行栈。

异步任务(js的异步是通过回调函数实现的放入到消息队列中)比如:

① 普通的事件。click、resize等
②资料加载,load、error 等
③ 定时器,setInterval、setTimeout等

三、执行顺序

①先执行执行栈中的同步任务
② 异步任务(回调函数)放入任务队列中
③ 一旦执行栈中的所有同步任务执行完毕,系统就会按次序读取任务队列中的异步任务,于是被读取的异步任务结束等待状态,进入执行栈,开始执行。

 如图:

 四、事件循环

 我们把任务分为同步任务异步任务。js把异步任务分为宏任务微任务

在es5之后,JavaScript引入了promise,这样不需要浏览器,JavaScript引擎自身也能够发起异步任务了。

宏任务 由(浏览器、node发起)、
微任务 由(js引擎发起的任务)比如promise(Promise本身是同步的,then/catch的回调函数是异步的)

所以我们把代码可能分为3种

① 同步代码(js执行栈/回调栈)
② 微任务的异步代码(js引擎)
   process.nextTick (node)
   promise.then( ) catch( )             Promise本身是同步,then/catch的回调函数是异步的微任务
 
 Async/Await 
   Object.observer等等
③ 宏任务的异步代码
   script(代码块)
   setTimeout/ setInterval定时器
   setImmediate 定时器
再看三种代码的执行顺序:
同步代码 →→→→微任务的异步代码(promise等)  →→→→宏任务的异步代码(setTimeout/ setInterval等)

如图:

五、案列

5-1案例:

<script>
    console.log(1);
    setTimeout(function() {
        console.log(2);
    },0)

    const p = new Promise((res,rej)=> {
        console.log(3);
        res(1000)
        console.log(4);
    }).then(data=> {
        console.log(data);
    })
    console.log(5);  //结果为 1 3 4 5 1000 2 
</script>

分析:

 5-2案例:

<script>
   new Promise((resolve,reject)=> {
        resolve(1)
        new Promise((resolve,reject)=> {
            resolve(2)
        }).then(data => {
            console.log(data);
        })
    }).then(data=> {
        console.log(data);
    })
    console.log(3);
    // 3 2 1
</script>

 ​​​​​​​5-3案例:

<script>
   setTimeout(() => {
        console.log(1);
    }, 0)
    new Promise((resolve, reject) => {
        console.log(2);
        resolve('p1')
        new Promise((resolve, reject) => {
            console.log(3);
            setTimeout(() => {
                resolve('setTimeout2')
                console.log(4);
            }, 0)
            resolve('p2')
        }).then(data => {
            console.log(data);
        })

        setTimeout(() => {
            resolve('setTimeout1')
            console.log(5);
        }, 0)
    }).then(data1 => {
        console.log(data1);
    })
    console.log(6);
  // 2 3 6 p2 p1 1 4 5
</script>

 分析:

  ​​​​​5-4案例:

<script>
   async function async1() {
        console.log('async1 start');
        await async2();
        console.log('async1 end');
    }
    async function async2() {
        console.log('async2');
    }
    console.log('script start');
    setTimeout(()=> {
        console.log('setTimeout');
    },0)
    async1();
</script>

分析:

   ​​​​​5-5案例:

<script>
    setTimeout(() => {
        console.log(0);
    }, 0)
    new Promise((res, rej) => {
        console.log(1);
        res();
    }).then(() => {
        console.log(2);
        new Promise((res, rej) => {
            console.log(3);
            res();
        }).then(() => {
            console.log(4);
        }).then(() => {
            console.log(5);
        })
    }).then(() => {
        console.log(6);
    })
    new Promise((resolve, reject) => {
        console.log(7);
        resolve(8);
    }).then((data) => {
        console.log(data);
        console.log(9);
    })
    //结果为???
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/440072.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文带你通俗理解23种软件设计模式(推荐收藏,适合小白学习,附带C++例程完整源码)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 一、设计模式是什么&#xff1f; 设计模式是为了解决在软件开发过程中遇到的某些问题而形成的思想。同一场景有多种设计模式可以应…

第18章_JDK8-17新特性(上)

第18章_JDK8-17新特性&#xff08;上&#xff09; 讲师&#xff1a;尚硅谷-宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a;http://www.atguigu.com 本章专题与脉络 1. Java版本迭代概述 1.1 发布特点&#xff08;小步快跑&#xff0c;快速迭代…

安装TortoiseGit后桌面文件夹和用户文件夹中显示红色叹号

✨ TortoiseGit作为一个很好用的git图形化工具&#xff0c;能够很方便的进行版本控制。但在安装这个软件之后就遇到了一个问题。 &#x1f440;问题描述&#xff1a;我们知道&#xff0c;安装TortoiseGit之后,当自己版本库中文件发生更改&#xff0c;但还没有提交到受控库时&am…

信息系统管理工程师好考吗?如何去备考呢?

信息系统管理工程师有点难度&#xff0c;侧重于IT技术的中级资格考试&#xff0c;主要适合系统管理员等专业技术人员去考 一、信息系统管理工程师考试介绍&#xff1a; 考试科目有两科&#xff0c;且成绩不延续&#xff0c;考试都合格后的证书是永久有效的。 报考条件&#x…

文件改名,如何将文件复制到指定文件夹里,并设置自动编号同名文件

在工作中&#xff0c;我们经常会遇到要将文件进行备份的时候&#xff0c;那么文件名称相同的情况下要如何批量备份呢&#xff1f;又如何自动编号同名文件&#xff1f;今天小编就给大家分享一下我的操作办法。 首先&#xff0c;第一步我们要进入“文件批量改名高手”的主页面并…

pot lib:optimal transport python库

文章目录 transport1. [计算最优传输&#xff08;Computational Optimal Transport&#xff09;](https://zhuanlan.zhihu.com/p/94978686)2. 离散测度 (Discrete measures), 蒙日(Monge)问题, Kantorovich Relaxation (松弛的蒙日问题)3. scipy.stats.wasserstein_distance 距…

CVPR2023活体检测Instance-Aware Domain Generalization for Face Anti-Spoofing学习笔记

论文链接&#xff1a;https://arxiv.org/pdf/2304.05640.pdf 代码链接&#xff1a;GitHub - qianyuzqy/IADG: (CVPR 2023) Instance-Aware Domain Generalization for Face Anti-Spoofing&#xff08;尚未公布&#xff09; 研究动机 此前的基于域泛化&#xff08;domain gen…

信号完整性分析:关于传输线的三十个问题解答(二)

11.对于 50 欧姆带状线的纵横比&#xff0c;什么是好的经验法则&#xff1f;(What is a good rule of thumb for the aspect ratio of a 50-Ohm stripline?) 在带状线几何形状和 FR4 基板中&#xff0c;线宽和平面之间的电介质间距的纵横比为 。由于有两个平面&#xff0c;带…

如何快速建立一个podman环境

本文介绍如何安装podman&#xff0c;并创建podman容器 环境 Centos8 安装podman Podman 是一个容器环境&#xff0c;首先在主机上安装 Podman。执行下面命令来安装podman&#xff1a; [rootlocalhost ~]# yum -y install podman然后修改一下用户命名空间的大小&#xff1a…

202305读书笔记|《因思念而沉着》——任何赞美都是身外之物唯自由可随身携带

《因思念而沉着》作者巴哑哑&#xff0c;忘了是什么时候加入的书架&#xff0c;昨天下班地铁上读完的书。是美的&#xff01; 部分节选如下&#xff1a; 羽叶茑萝举着熄灭的花青色的小枣落了一地所以哭泣沾染上了你的脸 在没落下 当我们开始生活 就是开始患上了眼疾你独自悲伤…

互联网求职指南2023版(内含腾讯、阿里、字节真实面经)

0. 缘起 五年前&#xff0c;小编曾经写过一篇文章&#xff0c;文章主要带大家了解当时的互联网巨头公司、独角兽公司。并给出了互联网的求职建议。从简历、知识储备、暑期实习、面试上给出了中肯的建议。现在看来也是很受用的&#xff0c;感兴趣的可以点击链接《互联网求职指南…

【人工智能概论】 构建神经网络——以用InceptionNet解决MNIST任务为例

【人工智能概论】 构建神经网络——以用InceptionNet解决MNIST任务为例 文章目录 【人工智能概论】 构建神经网络——以用InceptionNet解决MNIST任务为例一. 整体思路1.1 两条原则1.2 四个步骤 二. 举例——用InceptionNet解决MNIST任务2.1 模型简介2.2 MNIST任务2.3 完整的程序…

【ChatGPT 】ChatGPT Sidebar 实战:自定义 ChatGPT 搜索页面回复模板(示例开发和文员专用模板)

目录 一、前言 二、ChatGPT Sidebar 通用配置 &#xff08;1&#xff09;通用配置入口 &#xff08;2&#xff09;设置 ① 如何访问 ChatGPT ② 语言 ③ 主题 三、ChatGPT Sidebar 搜索页面 &#xff08;1&#xff09;搜索页面入口 &#xff08;2&#xff09;设置 …

Node 05-Node.js模块化

Node.js 模块化 介绍 什么是模块化与模块 ? 将一个复杂的程序文件依据一定规则&#xff08;规范&#xff09;拆分成多个文件的过程称之为 模块化 其中拆分出的 每个文件就是一个模块&#xff0c;模块的内部数据是私有的&#xff0c;不过模块可以暴露内部数据以便其他模块使用…

【问题解决】Git报错:failed to push some refs to xxxxx

Git报错&#xff1a;failed to push some refs to xxxxx To https://xxxxxxxxxxxx.git ! [rejected] master -> master (fetch first) error: failed to push some refs to ‘https://xxxxxxxx.git’ hint: Updates were rejected because the remote contains work that yo…

AI+明厨亮灶智能算法 yolo

AI明厨亮灶智能算法通过pythonyolo网络模型分析算法&#xff0c;AI明厨亮灶模型算法可接对后厨实现如口罩识别、厨师服穿戴、夜间老鼠监测、厨师帽识别、厨师玩手机打电话识别、抽烟识别等实时分析监测。Python是一种由Guido van Rossum开发的通用编程语言&#xff0c;它很快就…

领导力专题︱聊聊领导力的主要问题

本文内容结构 一、领导力的主要问题&#xff1a;领导者与下属 1、让人敬佩的领导者的能力与技巧 2、下属的期望 &#xff08;1&#xff09;热情 &#xff08;2&#xff09;重视 &#xff08;3&#xff09;欣赏 &#xff08;4&#xff09;归属感 3、下属&#xff08;追随…

微结构MRI参数估计的神经网络:在白质扩散-弛豫模型中的应用

导读 通过使用生物物理模型来解释弛豫-扩散MRI大脑数据&#xff0c;可以研究白质微观结构的具体特征。尽管更复杂的模型有可能揭示组织的更多细节&#xff0c;但也会导致参数估计耗时较长&#xff0c;由于简并拟合地形中普遍存在局部最小值&#xff0c;这些参数估计可能会收敛…

软件测试工程师需要达到什么水平才能顺利拿到 20k 无压力?

最近有粉丝朋友问&#xff1a;软件测试员需要达到什么水平才能顺利拿到 20k 无压力&#xff1f; 这里写一篇文章来详细说说&#xff1a; 目录 扎实的软件测试基础知识&#xff1a;具备自动化测试经验和技能&#xff1a;熟练掌握编程语言&#xff1a;具备性能测试、安全测试、全…

前端Vue.js项目开发,不重启项目,快速切换后台地址---使用nginx负载简单快速实现更换后台代理地址

前端Vue.js项目开发,不重启项目,快速切换后台地址—使用nginx负载简单快速实现更换后台代理地址 本文实现了在vue项目不重启的情况下&#xff0c;快速实现更换联调后台服务器的方法&#xff0c; 能够大大节省vue项目重启时间 chen 2023-04-20 文档源码地址,最新版本会在这里修改…