首页 > 编程语言 >2.JavaScript如何实现异步编程,可以详细描述EventLoop机制

2.JavaScript如何实现异步编程,可以详细描述EventLoop机制

时间:2023-03-04 18:14:43浏览次数:47  
标签:异步 JavaScript 队列 EventLoop 回调 任务 调用 执行

单线程和异步

js的任务分为同步和异步两种,它们的处理方式也不同,

同步任务是直接在主线程上排队执行,异步任务则会被放在任务队列中,

若有多个任务(异步任务)则要在任务队列中排队等待,任务队列类似一个缓冲区,任务下一步会被移到调用栈(callstack),然后主线程执行调用栈的任务。

JavaScript如何实现异步编程

第一种就是回调函数

第二种就是事件监听

第三种就是发布/订阅  ”发布/订阅模式”(publish-subscribe pattern),又称”观察者模式”

第四种就是Promise对象,CommonJS工作组提出的一种规范,目的是为异步编程提供统一接口。

它的思想是,每一个异步任务返回一个Promise对象,该对象有一个then方法,允许指定回调函数。

EventLoop

同步任务和异步任务是分开的,

事件循环就是基于之上的

调用栈的任务执行完之后会去查看任务队列是否存在任务

若是存在则推到调用栈执行

执行完之后再去查看任务队列

基于这种机制形成的循环就叫 EventLoop

 

宏任务和微任务

从上述知道了事件循环的基本原理,但事实上任务队列并不只有一个

宏任务包括:

  • 整体JS代码,
  • 事件回调,
  • XHR回调,
  • 定时器(setTimeout, setInterval, setImmediate),
  • IO操作,
  • UI render

微任务包括:

  • promise回调
  • MutationObserver
  • process.nextTick
  • Object.observe(已废弃)

其中定时器 setImmediate(某些浏览器也有,非标准 )和process.nextTick是node独有

event loop(事件循环)

执行机制过程如下:

  • 所有同步任务都在主线程上执行,形成一个执行栈(调用栈)
  • 主线程之外,还存在一个任务队列,浏览器的各种WEB API为异步的代码提供了一个单独的运行空间,当异步的代码运行完毕之后,会将代码中的回调送入到任务队列中
  • 一旦主线程的栈中的所有同步任务执行完毕后,调用栈为空时系统就会将队列中的回调函数依次压入调用栈中执行,当调用栈为空时,仍然会不断循环检测任务队列中是否有代码需要执行。

这一过程就是eventloop机制

标签:异步,JavaScript,队列,EventLoop,回调,任务,调用,执行
From: https://www.cnblogs.com/alwaysrun/p/17178741.html

相关文章

  • 浅谈下javascript的proxy和reflect
    近日喜欢上了uniapp和vue,但看到相关程序代码中频繁出现了proxy和reflect的使用,于是进行了一番学习,现总结如下。Proxy和Reflect是ES6(ECMAScript2015)引入的两个新的特性,它......
  • 关于 Javascript 的几种继承
    原型链的概念:原型链通俗易懂的理解就是可以把它想象成一个链条,互相连接构成一整串链子而原型链中就是实例对象和原型对象之间的链接每个函数都有一个prototype属性,这个p......
  • 7.如何处理循环的异步操作
    functiongetMoney(){varmoney=[100,200,300]for(leti=0;i<money.length;i++){compute.exec().then(()=>{console.log(money[i])......
  • JavaScript Modal Image
    <!DOCTYPEhtml><html><head><title>JavaScriptModalImage</title></head><styletype="text/css"> .modal{ position:fixed; z-index:1......
  • Spring Boot @Scheduled 是同步还是异步,单线程还是多线程?
    @schedule刚开始用的时候回遇到一些坑,主要就是他的同步、异步、多线程的配置问题,这篇文章介绍了@schedule的使用方法,读者遇到问题时可以参考下。1.问题@schedule注解默......
  • 3.理解JavaScript的执行上下文、执行上下文栈,可以应用堆栈信息快速定位问题
    1.执行上下文执行上下文就是当前JavaScript代码被解析和执行时所在环境的抽象概念,JavaScript中运行任何的代码都是在执行上下文中运行1.执行上下文的类型全局执行......
  • 2.理解JavaScript的作用域和作用域链
    什么是作用域Javascript中的作用域说的是变量的可访问性和可见性。也就是说整个程序中哪些部分可以访问这个变量,或者说这个变量都在哪些地方可见。作用域的类型全局作......
  • JavaScript中Date对象
    当我们收到甲方的需求,要做一个类似于商城之类的项目的时候,JS的Date对象就至关重要了.因为在商城中,各种优惠和折扣,就需要在一个时间的紧迫下,才能达到一个火爆的效果,......
  • JavaScript——快速判断数组对象的值是否全部满足条件
    前言EasyBe主题开发中遇到一个问题,查看了下MDN文档找到了比较合适的方法,这里只做了简单的示例,详细的一些描述和原理建议访问MDN进行查看;every:everysome:some内容ev......
  • 阻塞I/O,非阻塞I/O,同步I/O,异步I/O
    根据应用程序是否阻塞自身运行分为:阻塞I/O:是指应用程序在执行I/O操作后,如果没有获得响应,      就会阻塞当前线程,不能执行其他任务。非阻塞I/O:是指应用程序在执......