美文网首页我爱编程
2018-04-09 JS异步与同步以及回调函数

2018-04-09 JS异步与同步以及回调函数

作者: OK_8242 | 来源:发表于2018-04-09 16:20 被阅读0次

    大家好,我是IT修真院成都分院第10期学员李劲宏,一枚正直纯洁善良的web程序员,今天给大家分享JS异步与同步以及回调函数。

    什么是同步,什么是异步?

    同步指的是一次只能完成一件任务。如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推。

    异步指的是每一个任务有一个或多个回调函数(callback),前一个任务结束后,不是执行后一个任务,而是执行回调函数,后一个任务则是不等前一个任务结束就执行,所以程序的执行顺序与任务的排列顺序是不一致的、异步的。

    javascript实现异步的原理?

    首先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引擎处理。

    注意:js的工作机制是当线程空闲的情况下才会执行异步代码的回调

    即当所有同步任务执行完毕后才会执行异步任务的回调

    异步回调函数会在执行完所有同步任务后再执行

    总结:当Js执行到异步任务后,会将异步任务交给浏览器进行执行,当执行有结果时会把异步任务的回调函数插入待处理队列的队尾。

    小课堂提问:

    1.ajax发送异步请求浏览器做了什么?

    1.Js创建了一个ajax请求

    2.浏览器另外开启一个ajax引擎线程,执行ajax请求

    3.执行得到响应后将回调函数放入任务队列中。

    4.Js执行任务队列中的回调函数。

    2.有哪些常见的异步回调函数?

    1.点击事件中作为参数的函数。

    2.Ajax请求中的then函数。

    3.定时器中作为参数的函数。

    3 .同时发送两个或以上ajax请求,这两个ajax请求需要排队吗,js线程先执行哪个ajax的回调?

    同时发送多个ajax请求,浏览器会就会开多个ajax请求的线程,ajax的回调顺序是,哪个先请求成功就先执行哪个的回调。

    相关文章

      网友评论

        本文标题:2018-04-09 JS异步与同步以及回调函数

        本文链接:https://www.haomeiwen.com/subject/lzpihftx.html