同步异步的原理| 学习笔记

简介: 快速学习同步异步的原理。

开发者学堂课程【Ajax 前端开发入门与实战同步异步的原理】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/595/detail/8529


同步异步的原理

 

1、异步的底层原理

js 中的异步的实现的原理是单线程加事件队列,js 的代码执行是单线程的,所谓的单线程的含义是 js 的代码是从上往下按顺序依次执行的,一定是上一行代码执行完再执行下一行代码。事件队列可以认为是一个容器,这个容器中存储一些回调函数。

这些回调函数只有在 js 代码全部执行完成之后,才有可能会去调用,因为js是单线程的,一次只能做一件事情。

(1)代码展示: 

<script type="text/javascript>

setTimeout(function(){

console.log("定时函数代码执行了”);

},2000);//时间为0,依然先执行正常代码

console.log("正常代码执行了");

</script>

注释:

必然先执行输出正常代码,然后执行输出定时函数,而且是在2s之后输出。

如果继续加代码是:

<script type="text/javascript>

setTimeout(function(){

console.log("定时函数代码执行了”);

},2000);//时间为0,依然先执行正常代码

for(var i=0;i<10000000;i++){

str += i

}//依然先执行正常代码

console.log("正常代码执行了");

for(var i=0;i<10000000;i++){

str += i//依然先执行正常代码

</script>

js 在空闲的情况下,会去事件队列中看,有没有方法达到促发条件。 

image.png

一直都是先执行正常代码,后执行定时代码。

回调函数:

例如:window.onload = function(){};

btn.onclick

input.onblur

xhr.onreadystatechange = function(){}

都是先将 function 放入事件队列中,先存,等js代码执行后,再回到事件队列中看,那些函数满足促发条件。

(2)代码展示

username.onblur = function(){

var usernameValue = username.value;

//将 usernameValue 提交给服务器,有服务器进行唯一性的校验

//1.创建对象,兼容处理

var xhr = null;

if(window.XMLHttpRequest)

xhr = new XMLHttpRequest();

}else {

xhr = new ActiveXObject(“Microsoft.XMLHTTP");

}

//2.准备发送

xhr.open("get",”./server/checkUsername.php?uname= +

usernameValue,false);//false,用户是操作不了界面的,这是同步与异步的区别

//3.执行发送

xhr.send(null);

//制定回调函数

//xhr.onreadystatechange = function(){

if(xhr.readyState ==4)(

if(xhr.status == 200)

var result = xhr.responseText;

var username_result

=document.querySelector(“#username_result");

if(result == "ok"){

username_result.innerText = "用户可以使用";

}else{

username_result.innerText = "用户已经被注册";

}

}

}

}

(3)js 代码是单线函数,只会从上到下依次执行,一步一步执行。

false 的情况下:

xhr.send(null);//会卡住,是同步,下面的代码就不会执行,

True的情况下:

xhr.send(null);//不会卡在这个方法当中,是异步的,是必须执行下面的函数,执行完下面所以代码后,会检查这里面的代码是否满足 onreadystatechange 的条件

false是异步请求,再这样的情况下

image.png

相关文章
|
Web App开发 JavaScript Java
XWalkView+html 开发Android应用
在Android开发中有时候为了开发简洁和方便移植,采用了Html+WebView的开发模式,然而Android自带的WebView控件是调用的本机的浏览器内核,有些版本较老的手机浏览器和手机性能都不能满足需求(表现在html5不兼容、体验不流畅等地方)。
2412 0
|
7月前
|
小程序 Java 关系型数据库
weixin025移动学习平台的设计与实现+ssm(文档+源码)_kaic
基于微信小程序的移动学习平台旨在解决传统APP占用过多手机存储空间的问题,提升用户体验。该平台使用微信开发者工具开发前端,SSM框架和Java语言开发后台,并采用MySQL数据库保存数据。系统支持管理员对教师、课程、学生信息进行管理,教师可查看及审核作业,管理课程资源;学生能提交作业、查看审核结果并收藏或评论课程资源。此平台使用户无需安装独立APP即可访问学习内容,极大提升了便捷性和管理效率。 关键词:基于微信小程序的移动学习平台;微信开发者工具;SSM框架
|
12月前
|
敏捷开发 数据可视化 BI
配置状态报告是什么?包括哪些编制步骤?需要注意哪些关键环节?
配置状态报告(CSR)是项目管理和系统开发中用于跟踪和记录项目配置项状态的重要工具,涵盖软件、硬件、文档等。它不仅提供项目当前状态、历史变更及发展趋势的清晰视图,还通过增强项目透明度、有效管理变更、支持决策制定和促进知识共享,帮助项目团队做出明智决策,确保项目按计划顺利进行。随着项目规模和复杂度的增加,CSR的重要性愈发凸显,现代项目管理工具已实现其编制和管理的自动化与智能化。
|
存储 安全 小程序
什么是云计算,为什么选择阿里云?
阿里云提供的云计算服务让您能以按需、按量的方式获取算力,涵盖计算、存储、网络等多种形态,无需自建数据中心。它具备弹性、敏捷、安全、稳定、高性能和低成本等优势,支持业务快速创新,保障数据安全及业务连续性,帮助您专注于核心业务发展。常见应用场景包括网站、小程序、移动应用及大模型问答机器人等。
419 1
|
JSON NoSQL MongoDB
蓝易云 - mongodb数据如何导入到clickhouse
以上步骤是一种通用的方法,具体的实现可能会根据你的具体需求和数据结构有所不同。
299 1
|
XML 数据采集 编解码
【Python】已解决:UnicodeEncodeError: ‘utf-8’ codec can’t encode character ‘\udf76’ in position 32: surrog
【Python】已解决:UnicodeEncodeError: ‘utf-8’ codec can’t encode character ‘\udf76’ in position 32: surrog
205 0
Warning: To load an ES module, set “type“: “module“ in the package.json or use the .mjs extension.
Warning: To load an ES module, set “type“: “module“ in the package.json or use the .mjs extension.
|
存储 安全 数据库
从内到外,彻底搞懂sa-token和Oauth2.0的防线
从内到外,彻底搞懂sa-token和Oauth2.0的防线
1820 0
|
监控 算法 安全
计算机在航空航天领域的应用
计算机在航空航天领域的应用
|
缓存 NoSQL Java
springboot 启动加载数据库数据到redis缓存
springboot 启动加载数据库数据到redis缓存
632 0