例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
总结
- 事件轮询:js实现异步的具体解决方案
- 同步代码直接执行比如上列代码中的 consold.log(1)
- 异步函数先放在异步队列中
- 待同步代码执行完毕后会轮询执行异步队列中的函数
来源:CSDN
作者:鳄鱼吃了我的房子
链接:https://blog.csdn.net/JasonAlonk/article/details/104574404