JS(异步与单线程)

JS(异步与单线程)

题目1.同步和异步的区别是什么,试举例(例子见知识点)

区别:

1.同步会阻塞代码执行,而异步不会

2.alert 是同步,setTimeout 是异步

题目2.关于 setTimeout

结果:1 3 5 2 4

题目3.前端使用异步的场景有哪些

 1.定时任务:setTimeout,setInverval

2.网络请求:ajax 请求,动态<img>加载

3.事件绑定

知识点

一、什么是异步

结果:100 300 200

异步结果:100 300(不做等待) 200

同步结果:100 200(等待) 300   (会阻塞后面代码的运行)

对比同步

结果(同步):100 200(点击确认) 300  

何时需要异步

1.在可能发生等待的情况

2.等待过程中不能像 alert 一样阻塞程序运行

总之,所有的“等待的情况”都需要异步

二、前端使用异步的场景

1.定时任务:setTimeout,setInverval

2.网络请求:ajax 请求,动态<img>加载

ajax 请求示例

结果:

ajax 请求需要等待

 

过程:1.执行第一行,打印  start

          2.执行 $.get 后,函数 data1 会被暂存起来,不会立即执行(单线程的特点,不能同时干两件事)

          3.执行最后一行,打印300

          4.待所有程序执行完,处于空闲状态时,会立马看有没有暂存起来的要执行

         5.发现暂存起来的 $.get 中的 data1 未执行,待请求 data1.json返回 后,立即执行 data1

 动态<img>加载示例

结果:

不知道图片何时完成加载,需要等待

 3.事件绑定

事件绑定示例

结果:(点击之后才出现 clicked)

 

不知道用户何时点击,需要等待

三、异步和单线程

JS 是单线程的语言,所谓“单线程”就是一根筋,对于拿到的程序,一行一行的执行,直到上面的执行为完成,只能做这一件事

 

输出:100 300 200

这个任务是串行的,不能发生阻塞,使用异步解决这种问题

过程:1.执行第一行,打印100

           2.执行setTimeout 后,传入setTimeout 的函数会被暂存起来,不会立即执行(单线程的特点,不能同时干两件事)

           3.执行最后一行,打印300

           4.待所有程序执行完,处于空闲状态时,会立马看有没有暂存起来的要执行

           5.发现暂存起来的 setTimeout 中的函数无需等待时间,立即起来执行

执行程序这样没有问题,但是对于 JS 最初使用的环境 ———— 浏览器客户端 ———— 就不一样了。因此在浏览器端运行的 js ,可能会有大量的网络请求,而一个网络资源啥时候返回,这个时间是不可预估的。这种情况也要傻傻的等着、卡顿着、啥都不做吗?———— 那肯定不行。

因此,JS 对于这种场景就设计了异步 ———— 即,发起一个网络请求,就先不管这边了,先干其他事儿,网络请求啥时候返回结果,到时候再说。这样就能保证一个网页的流程运行。

posted @ 2018-05-04 23:13  姜皓  阅读(218)  评论(0编辑  收藏  举报