JS异步



  • JavaScript异步特性

    JavaScript是单线程的,那么单线程怎么处理网络请求、文件读写等耗时操作呢?JavaScript是怎样处理异步问题的呢?

    同步:Synchronous:在函数返回时,调用者就能拿到预期结果

    异步:Asynchronous:在函数返回时,调用者还不能拿到预期结果,需要通过一定的手段才能获得

    JavaScript的运行通常是在浏览器中进行的,具体由js引擎去解析和运行

    浏览器线程

    一个浏览器通常包含以下常驻线程:

    • 渲染引擎线程 :负责页面渲染
    • JS引擎线程:负责JS的解析和执行
    • 定时触发器线程:处理定时事件
    • 事件触发线程:处理DOM事件
    • 异步HTTP请求线程:处理HTTP请求

    虽然JavaScript是单线程的,但浏览器内部不是单线程的。

    一些I/O操作、定时器的计时和事件监听等都是由浏览器提供的其他线程来完成的

    消息队列与事件循环(event loop)

    如上图所示(图没了),左边的栈存储的是同步任务,就是那些能立即执行、不耗时的任务,如变量和函数的初始化、事件的绑定等等那些不需要回调函数的操作都可归为这一类。

    右边的堆用来存储声明的变量、对象。下面的队列就是消息队列,一旦某个异步任务有了响应就会被推入队列中。如用户的点击事件、浏览器收到服务的响应和setTimeout中待执行的事件,每个异步任务都和回调函数相关联。

    JS引擎线程用来执行栈中的同步任务,当所有同步任务执行完毕后,栈被清空,然后读取消息队列中的一个待处理任务,并把相关回调函数压入栈中,单线程开始执行新的同步任务。

    JS引擎线程从消息队列中读取任务是不断循环的,每次栈被清空后,都会在消息队列中读取新的任务,如果没有新的任务,就会等待,直到有新的任务,这就叫事件循环


 

Copyright © 2018 bbs.dian.org.cn All rights reserved.

Looks like your connection to Dian was lost, please wait while we try to reconnect.