异步编程
js是单线程的,同一时间只能做一件事情。js设置为单线程是为了避免复杂性和dom渲染冲突。
单线程意味着前一个任务结束才会执行后一个任务。如果前一个任务耗时很长,则后一个任务不得不被等待!!!!但是大多耗时较长的都是io任务(输入输出任务,网络的请求与回应),因此让cpu空闲去等待io任务,效率会很低下,所以我们可以不管io设备,挂起等待中的任务,先运行后面的任务,等io设备返回了结果再把挂起的任务执行下去。!!!!!
同步任务:你走了我再走,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务。
异步任务(需要等待的任务):你走一截,我走一截。不直接进入主线程,而进入“任务队列"的任务通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。
异步任务的运行机制
任务队列就是一个消息队列,io完成一项任务就会在消息队列中添加一个事件,表示相关的异步任务可以进入执行栈了!!!!
1.所有同步任务都在主线程上,形成一个执行栈
2.主线程之外还有个任务队列,只要异步任务运行结果(被人点击了),就在任务队列之中放置一个事件
3.一旦执行栈中同步任务执行完毕,系统就会读取任务队列
4.只要执行栈一清空,事件队列队首就会进去
如此循环
事件队列中放哪些事件:io设备,鼠标点击,指定过回调函数的事件(注册事件:给这个事件绑定了回调函数)
es6种有两种事件队列:宏任务和微任务:先拿宏任务,再去拿微任务,只要微任务队列里面有,就清空微任务队列。在执行下一个宏任务之前必须清空微任务队列
定时器事件
setTimeout()一次执行,setInterval()反复执行
<SCript>
console.log("START");
setTimeout(function(){
console.log("等哈");
},1000)
console.log("结束了");
</SCript>
<SCript>
console.log("START");
setTimeout(function(){
console.log("等哈");
},0)
console.log("结束了");
</SCript>
两者等哈两个字都是最后出现的,为什么???
先将执行栈执行完再执行settimeout!!!定时器再1秒后被放在了任务队列,规定了最小时间为4ms,如果低于这个值会自动改为4ms
异步返回值
在回调函数中包含要使用异步返回值的代码,将异步结果作为该函数的参数