JS笔记(20): JS中的同步编程和异步编程
铺垫:关于定时器
定时器:设定一个定时器,并且设定了等到的时间,当到达指定的时间,浏览器会把对应的方法执行
1)常用的定时器
- 1.
setTimeout(function,intarval)
执行一次 - 2.
setInterval(function,intarval)
可执行多次 function
: 到达时间后执行的方法(设置定时器的时候方法没有执行,到达时间后浏览器帮我们执行)interval
: 时间因子(需要等待的时间 ms)
2)清除定时器
clearInterval / clearTimeout
这两个方法中的任何一个都可以清除用任何方法创建的定时器
1.设置定时器会有一个返回值,这个值是一个数字,属于定时器的编号,代表当前是第几个定时器(不管
setTimeout
还是etInterval
创建定时器,这个编号会累加)2.
clearInterval(编号) / clearTimeout(编号)
根据序号清除浏览器中设定的定时器
// 执行一次
let count = 0;
setTimeout(()=>{count++;console.log(count)
},1000)
复制代码
// 轮循定时器:每间隔interval这么长时间,都会把设定的方法重新执行一次,直到定时器被清除
let count = 0;
let timer1 = setInterval(()=>{count++;console.log(count)if(count === 5){// 清除定时器clearInterval(timer1)}
},1000);let timer2 = setInterval(()=>{},1000);
复制代码
一、JS中的同步编程和异步编程:
- 同步编程:任务是按照顺序依次处理,当前这件事没有彻底做完,下一件事不能执行
- 异步编程:当前这件事没有彻底做完,需要等待一段时间才能继续处理,此时我们不等,继续执行下面的任务,当后面任务完成后,再去把没有彻底完成的事情完成
二、JS中的异步编程:
- 1.所有的事件绑定都是异步编程
xxx.onclick = function(){}
- 2.所有定时器都是异步编程
setTimeout(function(){},1000)
- 3.AJAX中一般都使用异步编程处理
- 4.回调函数也算是异步编程
三、浏览器是如何规划同步异步机制?
- 1.浏览器是多线程的,JS是单线程的(浏览器只给JS执行分配一个线程)
- 单线程的特点:一次只能处理一件事情
进程与线程
每一个应用程序都可以理解为一个进程(浏览器打开一个页面,就相当于开辟一个进程),在一个程序中(进程中),经常会同时处理多个事情,此时需要分配多个线程区同时完成多项任务
- 2.浏览器在单线程当中实现异步的机制,主要依赖于任务队列完成的,浏览器中有两个任务队列:主任务队列 & 等待任务队列
let n = 0;
setTimeout(()=>{console.log(++n); //=> 第二次输出:过1s输出1
},1000)
console.log(n); //=> 第一次输出:0
复制代码
// 定时器设定一个时间,到达时间后不一定执行(如果当前还有其他同步任务正在处理,那么到时间也得等着)
let n = 0;
setTimeout(()=>{console.log(++n);
},1000)
console.log(n); //=> 0
while(1===1){// 死循环
}
复制代码
测试程序反映时间
let startTime = new Date();
console.time('AA')
for (let i = 0; i < 900000000; i++) {}
console.timeEnd('AA') //200多ms
复制代码
执行题
题1
// 练习1
setTimeout(()=>{console.log(1);
},20);
console.log(2);
setTimeout(()=>{console.log(3);
},10);
setTimeout(()=>{console.log(4);
},100);
for (let i = 0; i <90000000; i++) {}
console.log(5);
// 2 5 3 1 4
复制代码
题2
// 练习2
let n = 0;
setTimeout(()=>{console.log(++n);
},0); // 定时器时间因子设置为0也不是立即执行,每一个浏览器都有一个自己最小的等待和反应时间(谷歌:5-6 IE:10-13),所以写0还是异步编程
console.log(n)
// 0 1
复制代码
题3
setTimeout(() => {console.log(1);
}, 20);
console.log(2);
setTimeout(() => {console.log(3);
}, 10);
console.log(4);
for (let i = 0; i < 90000000; i++) {// 此循环大概200ms
}
console.log(5);
setTimeout(() => {console.log(6);
}, 8);
console.log(7);
setTimeout(() => {console.log(8);
}, 15);
console.log(9);
// 2 4 5 7 9 3 1 6 8
// 因为中间有200ms的阻塞,所以在等待队列里,先输出阻塞前的 3 1 200ms结束后,输出阻塞后的 6 8
复制代码
JS笔记(20): JS中的同步编程和异步编程相关推荐
- Http中的同步请求和异步请求
最近在上springmvc的JSON数据交换的时候,老师下课提了一个课后问题:什么是异步请求?什么是同步请求?我想大部分同学听到这个问题的时候应该和我一样不知所云.现在,给大家分享一篇关于同步请求和异 ...
- [.NET] 怎样使用 async await 一步步将同步代码转换为异步编程
怎样使用 async & await 一步步将同步代码转换为异步编程 [博主]反骨仔 [出处]http://www.cnblogs.com/liqingwen/p/6079707.html ...
- 响应式编程(反应式编程)的来龙去脉(同步编程、多线程编程、异步编程再到响应式编程)
响应式编程的来龙去脉(同步编程.多线程编程.异步编程再到响应式编程) 文章目录 响应式编程的来龙去脉(同步编程.多线程编程.异步编程再到响应式编程) 简介 1. 示例 2. 同步编程 3. 多线程编程 ...
- SAP UI5中的同步请求和异步请求
本文介绍SAP UI5中的同步请求和异步请求 Created by Wang, Jerry, last modified on Jul 04, 2016 要获取更多Jerry的原创文章,请关注公众号& ...
- FPGA零基础学习:在FPGA中,同步信号、异步信号和亚稳态的理解
FPGA零基础学习:在FPGA中,同步信号.异步信号和亚稳态的理解 叁芯智能科技-郝旭帅团队打造"FPGA 设计与研发"学习系列, 可以让设计者从"小白"到&q ...
- C#并发编程之异步编程(一)
写在前面 C#5.0中,对异步编程进行了一次革命性的重构,引入了async和await这两个关键字,使得开发人员在不需要深刻了解异步编程的底层原理,就可以写出十分优美而又代码量极少的代码.如果使用得当 ...
- C/C++编程:异步编程入门
背景 在产品端开发软件多了,免不了遇到多线程处理的情况,这也符合多核.异构的现代化硬件发展的需求.多线程处理中常见的有两种应用情形: 并行化算法处理.利用OpenMP/TBB等CPU并行库,或者CUD ...
- 异步编程之异步编程与多线程编程的联系和区别
1.异步编程与多线程的区别 共同点:异步和多线程两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性 不同点: (1)线程不是一个计算机硬件的功能,而是操作系统提供的一种逻辑功能,线程本质上是 ...
- 关于JavaScript中的同步(SYNC)和异步(ASYNC)
同步和异步 JS是属于单线程的,也就是我们说的同步,但是JS中也有异步; JS中的异步编程: 1.定时器:多个定时器时,如果执行完成循环都到达时间了,先执行时间短的那个服务器2.事件绑定 :js是基于 ...
最新文章
- Linux负载均衡实现
- JSP学习笔记(一):JSP语法和指令
- Visial Studio 2019提示:namespace std 没有成员 max 的解决方法
- nodejs中的模块系统:exports导出模块
- 最新发布!斯坦福 CS224n 出作业视频详细讲解啦!
- 【机器学习】特征预处理
- delete 误删了全表数据
- SAP UI5 应用开发教程之四十 - 如何制作包含了 component-preload.js 在内的 SAP UI5 发布版本
- 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸
- jquery在当前页面打印页面div内容实例
- linux httpd 内存,apache占用内存过高耗完内存?
- 异步IO(来自博客园)
- setTimeout和setInterval
- Hololens开发入门篇-郑洪智-专题视频课程
- 微课|Python三种方法统计各分数段内的人数(17分钟)
- jquey 批量操作 checkbox
- JavaScript世界时万年历
- JAVA+Appium 自动化实现手机屏幕滑动点击操作
- MongoDB 学习笔记
- 【CC2640】CC2640架构及原理
热门文章
- boost::mp11::mp_copy_if相关用法的测试程序
- boost::interprocess::ipcdetail::private_adaptive_node_pool用法的测试程序
- boost::format模块一些真实的、简单的测试
- boost::empty_value的实例
- ITK:使用Deformation Field扭曲图像
- OpenCV iOS-图像处理
- QML模块定义qmldir文件
- Qt Creator设置Conan
- C++数组的左右旋转的实现算法(附完整源码)
- C++Adaline自适应线性神经网络算法(附完整源码)