1.背景介绍
同步指的是一次只能完成一件任务。如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推。
异步指的是每一个任务有一个或多个回调函数(callback),前一个任务结束后,不是执行后一个任务,而是执行回调函数,后一个任务则是不等前一个任务结束就执行,所以程序的执行顺序与任务的排列顺序是不一致的、异步的。
2.知识剖析
首先js是单线程的语言,即同一时间只能做做一件事。那Js如何实现异步的,异步和单线程不是自相矛盾吗?其实,单线程和异步确实不能同时成为一个语言的特性。js选择了成为单线程的语言,所以它本身不可能是异步的,但js的宿主环境(比如浏览器,Node)是多线程的,宿主环境通过某种方式(事件驱动,下文会讲)使得js具备了异步的属性。
浏览器的内核是多线程的,它们在内核制控下相互配合以保持同步,一个浏览器至少实现三个常驻线程:javascript引擎线程,UI渲染线程,浏览器事件触发线程。
1.javascript引擎线程是基于事件驱动单线程执行的,JS引擎一直等待着任务队列中任务的到来,然后加以处理,浏览器无论什么时候都只有一个JS线程在运行JS程序。
2.UI渲染线程负责渲染浏览器界面,当界面需要重绘(Repaint)或由于某种操作引发回流(reflow)时,该线程就会执行。但需要注意 UI渲染线程与JS引擎是互斥的,当JS引擎执行时UI线程会被挂起,UI更新会被保存在一个队列中等到JS引擎空闲时立即被执行。
3.事件触发线程,当一个事件被触发时该线程会把事件添加到待处理队列的队尾,等待JS引擎的处理。这些事件可来自JavaScript引擎当前执行的代码块如setTimeOut、也可来自浏览器内核的其他线程如鼠标点击、AJAX异步请求等,但由于JS的单线程关系所有这些事件都得排队等待JS引擎处理。
3.常见问题
1.ajax发送异步请求浏览器做了什么。
2.有哪些常见异步回调函数?
4.解决方案
1.Js创建了一个ajax请求
2.浏览器另外开启一个ajax引擎线程,执行ajax请求
3.执行得到响应后将回调函数放入任务队列中。
4.Js执行任务队列中的回调函数。
2.常见的异步
1,点击时间,
2,定时器,
3,AJAX请求。
5.遇到到问题。
如何写一个简单的异步操作。
答:回调函数也相当于异步操作,所以可以在函数A里面回调函数B。
如果俩个定时器操作耗时一样长或者一个比一个操作耗时稍微短,代码如何执行。
答:异步操作总是将耗时的任务放在后面执行所以耗时短的将会在前面执行,如果耗时一样长则看函数的排序,或者是否回调。
Promise也是一种异步操作.then也是异步操作,这是为什么。
具体我也不是很清除,一时半会不解决不了,所以我就说一下自己的理解,Promise是一种异步操作,.then是Promise的方法所以.then也是一种异步操作,自己的理解很可能不对,毕竟我也没怎么了解过。