单线程和异步
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