javaScript异步编程总结

JavaScript是一门单线程的非阻塞的脚本语言

javaScript最初是运行在浏览器端的脚本语言,解决的问题相对简单。目的是实现页面的动态交互,实现页面动态交互的核心就是DOM操作。所以采用单线程模式,避免多线程同步问题。

同步模式与异步模式

JavaScript运行代码时会存在两种模式:同步模式与异步模式。存在异步模式的原因也很简单。因为同步模式下执行一段代码,代码
中任务依次执行,前一个任务结束后才会进行下一个任务。当执行某些耗时任务时就会造成堵塞。所以异步模式就把这些耗时的任务单体提出来另外执行,等到同步代码执行完后再去返回执行好的异步任务的结果。

event loop(事件循环)

evnet loop的作用就是解决js单线程运行时不会阻塞的一种机制。
先看下面这个流程图


event loop流程图
  • call stack是调用栈,js代码会放在这里执行
  • event loop是事件循环,它负责的就是不断检查调用栈中是否还有任务,如果没有就将右侧消息队列中的任务放入调用栈。

下面来分析这个流程图:

  1. 执行代码,将任务放入调用栈,判断是同步任务还是异步任务。如果是同步任务就执行该任务。异步任务则会被放入异步队列中执行,拿到结果的异步任务被放入消息队列中等待。
  2. 当c调用栈中同步任务执行完后,就从消息队列中依次异步任务压入调用栈。Event Loop去不停检查调用栈中是否还有任务,如果没有就去看消息队列中有没有任务,如果有就放入调用栈,如此反复,直到完成所有任务。

宏任务与微任务

  • 宏任务有整体代码,setTimeout,I/O,setInterval等
  • 微任务有process.nextTick(Node),Promise


    宏任务,微任务流程图

这里不同类型的任务会进入不同的事件队列。事件循环顺序是先去执行宏任务,执行宏任务时检查有无微任务,有微任务就放入末尾,等当前宏任务执行完后依次执行微任务。待这个宏任务中的微任务执行完后再执行下一个宏任务。
这里打个比方,在银行排队办业务的人,他所要办的主要的事比如取钱,这是一个宏任务,当他取完钱以后他想查询一下余额,这个可以看成微任务。这时,他不需要再去排队,直接查询余额。等他办完事走了下个人继续办理业务。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容