2.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机制

posted @ 2023-03-04 17:56  不想做混子的奋斗远  阅读(46)  评论(0)    收藏  举报