zoukankan      html  css  js  c++  java
  • JavaScript异步的底层原理

    JavaScript引擎属于单线程作业,意味着:在同一时间只能执行一个代码块,这些代码块的执行就阻塞了异步事件的处理。

    因此,出现了"任务队列"(task queue),我们可以将任务分为两种:一种是同步任务(synchronous),另一种是异步任务(asynchronous)。
         同步任务:
    在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;
        异步任务:
    不进入主线程、而进入"任务队列"(task queue)的任务,只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。如回调函数就是异步任务
        
    具体来说,异步执行的运行机制如下。
         
     (1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。
          (2)主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
          (3)一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
          (4)主线程不断重复上面的第三步。
         只要主线程空了,就会去读取"任务队列",这就是JavaScript的运行机制。这个过程会不断重复。

    简单来说,事件队列中的任务执行的条件为:

                       1.主线程已经空闲 (同步任务已经执行完毕)
                       2.任务满足触发条件,如:
                           (1) 定是函数(延时时间已经达到)
                          (2)事件函数 (特定事件被触发)
                           (3)ajax的回调函数(服务器端有数据响应)
                

    下面用一个简单的例子来解释一下JavaScript处理任务处理的机制:

    执行结果:

     可见,定时器的回调函数是在js代码执行完成后,并满足了设置的时间条件,再执行的。

  • 相关阅读:
    python wx安装
    HttpPost请求将带有数组json格式数据作为请求体传入的简单处理方法
    介绍基于camera和IMU的SLAM算法数据采集环境搭建
    《Linux操作系统分析》课程学习总结报告
    安装Sophus出现error: lvalue required as left operand of assignment unit_complex_.real() = 1.问题的解决办法
    结合中断上下文切换和进程上下文切换分析Linux内核的一般执行过程
    深入理解系统调用
    基于mykernel 2.0编写一个操作系统内核
    QT 无法运行“rc.exe”?
    linux上boost库编程cmake配置出错
  • 原文地址:https://www.cnblogs.com/chenjun1/p/11682004.html
Copyright © 2011-2022 走看看