1.js是单线程的
- 单线程是什么
同一个时间只能做同一件事情,下一件事情需要等待上一件事执行完毕 - 为什么js是单线程?
js作为浏览器脚本语言,用途是与用户互动,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?单线程可以避免复杂性 - 单线程带来的问题和局限性
js是单线程语言,浏览器只分配给js一个主线程,用来执行任务(函数),但一次只能执行一个任务,这些任务形成一个任务队列排队等候执行,但前端的某些任务是非常耗时的,比如网络请求,定时器和事件监听,如果让他们和别的任务一样,都老老实实的排队等待执行的话,执行效率会非常的低,甚至导致页面的假死。所以,浏览器为这些耗时任务开辟了另外的线程,主要包括http请求线程,浏览器定时触发器,浏览器事件触发线程,这些任务是异步的。
2.同步和异步
1. 同步和异步的概念
- 由于js的单线程机制,假设此时有一个耗时很长的任务,那么会造成后续代码需要等待的时间太长,如果能够把耗时长的代码异步执行就好了,于是,所有任务可以分成两种,一种是同步任务( synchronous ),另一种是异步任务( asynchronous ,event loop是实现异步的一种机制
- 一般操作分为两步:发出调用和得到结果,发出调用立即得到结果是同步,发出调用,但无法立即得到结果,需要额外的操作才能得到预期的结果是异步
- 同步:调用和一直等待,直到返回结果
- 异步:调用后,拿到结果的中间可以介入其他任务
- 轮询:在收银台付钱后,做到位置上不停询问我的菜可以上了吗?
- 事件:收银台付钱后,不用不停的问,饭做好了服务员叫号喊你来取
2. 异步编程的核心
该节大部分内容引用自 《你不知道的JavaScript中册》
- 从发送网络请求到获取响应,等待用户输入,定时重复执行任务…任务,从任务的调用到得到结果,需要经过一段等待的时间间隙,程序需要管理这段时间间隙的状态
- 程序中现在运行的部分和将来运行的部分之间的关系就是异步编程的核心
- 最原始的处理异步的方法是回调函数,但是js作为在浏览器和服务器都可以运行的一套流行编程语言,js的规模和复杂性持续增长,需要更强大更合理的方法对异步进行管理
3. 异步的实现方式
场景:需要通过ajax请求数据赋值给data
let data=ajax(url)
console.log(data) //会是undefined,因为ajax请求是异步完成的,下面的打印语句在响应还没返回前就执行了
为了解决上述代码的问题,假如我们发出ajax请求调用,程序一直阻塞到ajax的响应返回,并赋值给data后才向下执行就ok了,但是我们并不是这么使用ajax的,想要现在我们发出