event-loop 事件轮循

丶灬走出姿态 提交于 2020-03-01 11:02:20

例1

setTimeout(()=> console.log(3), 100)
setTimeout(()=> console.log(2))
consold.log(1)

废话不多我们直入主题。首先 consold.log(1) 会直接输出因为是同步函数,之后会把setTimeout(()=> console.log(2))放入异步队列,之后是setTimeout(()=> console.log(3), 100)放入异步队列(因为有100毫秒的延迟,所以不在setTimeout(()=> console.log(2))前面),然后事件轮询机制会去异步队列里找有没有需要执行的函数,如果有就会放入主进程执行输出一直如此询环直到没有函数可以执行位置,最后输出是 1 2 3

例2

$.ajax({
	url: 'http://xxxxx',
	succes: () => {
		console.log('4)
	} 
})
setTimeout(()=> console.log(3), 500)
setTimeout(()=> console.log(2))
consold.log(1)

这里多了一个ajax其实就是一个障眼法说白了ajax也是异步代码,还是会放入异步队列里等待处理,但要注意的是这样可能会有不确定性,比如ajax特别快的情况下会优先于setTimeout(()=> console.log(3), 500)输出,正常输出是 1 2 3 4 ajax过快的情况下会变成1 2 4 3

总结

  1. 事件轮询:js实现异步的具体解决方案
  2. 同步代码直接执行比如上列代码中的 consold.log(1)
  3. 异步函数先放在异步队列中
  4. 待同步代码执行完毕后会轮询执行异步队列中的函数
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!