铺垫:关于定时器

定时器:设定一个定时器,并且设定了等到的时间,当到达指定的时间,浏览器会把对应的方法执行

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中的同步编程和异步编程相关推荐

  1. Http中的同步请求和异步请求

    最近在上springmvc的JSON数据交换的时候,老师下课提了一个课后问题:什么是异步请求?什么是同步请求?我想大部分同学听到这个问题的时候应该和我一样不知所云.现在,给大家分享一篇关于同步请求和异 ...

  2. [.NET] 怎样使用 async await 一步步将同步代码转换为异步编程

    怎样使用 async & await 一步步将同步代码转换为异步编程 [博主]反骨仔 [出处]http://www.cnblogs.com/liqingwen/p/6079707.html  ...

  3. 响应式编程(反应式编程)的来龙去脉(同步编程、多线程编程、异步编程再到响应式编程)

    响应式编程的来龙去脉(同步编程.多线程编程.异步编程再到响应式编程) 文章目录 响应式编程的来龙去脉(同步编程.多线程编程.异步编程再到响应式编程) 简介 1. 示例 2. 同步编程 3. 多线程编程 ...

  4. SAP UI5中的同步请求和异步请求

    本文介绍SAP UI5中的同步请求和异步请求 Created by Wang, Jerry, last modified on Jul 04, 2016 要获取更多Jerry的原创文章,请关注公众号& ...

  5. FPGA零基础学习:在FPGA中,同步信号、异步信号和亚稳态的理解

    FPGA零基础学习:在FPGA中,同步信号.异步信号和亚稳态的理解 叁芯智能科技-郝旭帅团队打造"FPGA 设计与研发"学习系列, 可以让设计者从"小白"到&q ...

  6. C#并发编程之异步编程(一)

    写在前面 C#5.0中,对异步编程进行了一次革命性的重构,引入了async和await这两个关键字,使得开发人员在不需要深刻了解异步编程的底层原理,就可以写出十分优美而又代码量极少的代码.如果使用得当 ...

  7. C/C++编程:异步编程入门

    背景 在产品端开发软件多了,免不了遇到多线程处理的情况,这也符合多核.异构的现代化硬件发展的需求.多线程处理中常见的有两种应用情形: 并行化算法处理.利用OpenMP/TBB等CPU并行库,或者CUD ...

  8. 异步编程之异步编程与多线程编程的联系和区别

    1.异步编程与多线程的区别 共同点:异步和多线程两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性 不同点: (1)线程不是一个计算机硬件的功能,而是操作系统提供的一种逻辑功能,线程本质上是 ...

  9. 关于JavaScript中的同步(SYNC)和异步(ASYNC)

    同步和异步 JS是属于单线程的,也就是我们说的同步,但是JS中也有异步; JS中的异步编程: 1.定时器:多个定时器时,如果执行完成循环都到达时间了,先执行时间短的那个服务器2.事件绑定 :js是基于 ...

最新文章

  1. Linux负载均衡实现
  2. JSP学习笔记(一):JSP语法和指令
  3. Visial Studio 2019提示:namespace std 没有成员 max 的解决方法
  4. nodejs中的模块系统:exports导出模块
  5. 最新发布!斯坦福 CS224n 出作业视频详细讲解啦!
  6. 【机器学习】特征预处理
  7. delete 误删了全表数据
  8. SAP UI5 应用开发教程之四十 - 如何制作包含了 component-preload.js 在内的 SAP UI5 发布版本
  9. 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸
  10. jquery在当前页面打印页面div内容实例
  11. linux httpd 内存,apache占用内存过高耗完内存?
  12. 异步IO(来自博客园)
  13. setTimeout和setInterval
  14. Hololens开发入门篇-郑洪智-专题视频课程
  15. 微课|Python三种方法统计各分数段内的人数(17分钟)
  16. jquey 批量操作 checkbox
  17. JavaScript世界时万年历
  18. JAVA+Appium 自动化实现手机屏幕滑动点击操作
  19. MongoDB 学习笔记
  20. 【CC2640】CC2640架构及原理

热门文章

  1. boost::mp11::mp_copy_if相关用法的测试程序
  2. boost::interprocess::ipcdetail::private_adaptive_node_pool用法的测试程序
  3. boost::format模块一些真实的、简单的测试
  4. boost::empty_value的实例
  5. ITK:使用Deformation Field扭曲图像
  6. OpenCV iOS-图像处理
  7. QML模块定义qmldir文件
  8. Qt Creator设置Conan
  9. C++数组的左右旋转的实现算法(附完整源码)
  10. C++Adaline自适应线性神经网络算法(附完整源码)