• js异步原理


    javascript引擎

    javascript引擎执行时单线程的,如果有一个任务被阻塞,整个浏览器就会处于假死状态
    那么遇到这种情况,又在单线程的情况下,不能像java之类的语言创建多几个线程来处理,如何解决呢,
    js的异步处理就被提出来了
    在执行javascript代码中,那些被javascript引擎认为是耗时任务的事件或者定时器,鼠标事件,ajax等,会被特殊处理
    而其他的代码(同步代码)则被依次添加到主线程栈中,被javascript引擎依次执行。

    那么那些被特殊处理的事件呢

    定时器

    在定时器被触发时,等到延迟结束,定时器的回调函数就会被添加到任务队列中,先后入队顺序根据延时时间长久

    鼠标事件

    在触发鼠标事件后,立即被添加进任务队列

    ajax等异步请求

    在网络请求成功后,回调函数才会被添加到任务队列

    那么任务队列什么时候被处理呢

    在主线程的同步代码被执行完毕,就会去任务队列查看有没有回调函数,有的话,就加载进入执行栈,开始执行

    具体来说,异步运行机制如下:
    (1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。
    (2)主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
    (3)一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
    (4)主线程不断重复上面的第三步。
    只要主线程空了,就会去读取"任务队列",这就是JavaScript的运行机制

  • 相关阅读:
    LVS DR实验!
    Memcached 与 Redis 区别
    LVS笔试题!
    并发编程拓展知识
    并发编程之协程
    并发编程之线程
    并发编程之多道技术
    粘包问题与socketserver实现并发
    套接字通信
    git的使用
  • 原文地址:https://www.cnblogs.com/reyirfw/p/13022265.html
Copyright © 2020-2023  润新知