博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js 任务
阅读量:6293 次
发布时间:2019-06-22

本文共 1174 字,大约阅读时间需要 3 分钟。

前言

先看一段代码

setTimeout(function() {    console.log('timeout');}, 0);new Promise((resolve, reject) => {    console.log('promise');    resolve();}).then(function() {    console.log('then');});console.log('global');

输出: promise 、global、 then、timeout

macrotasks 和 microtasks

在 V8 实现中包含两种任务:

macrotasks

script ,setTimeout, setInterval, setImmediate, I/O, UI rendering

microtasks

process.nextTick, Promises, Object.observe, MutationObserver

执行过程如下:

任务

  1. JavaScript 引擎首先从 macrotask queue 中取出第一个任务
  2. 执行完毕后,将microtask queue中的所有任务取出,按顺序全部执行
  3. 浏览器进行渲染视图然后再从 macrotask queue 中取下一个
  4. 执行完毕后,再次将 microtask queue 中的全部取出;
  5. 循环往复,直到两个 queue 中的任务都取完。

注意:

  1. 从上面可以看到,microtask 会执行完毕才进行渲染,如果 microtask 执行时间教长,会导致卡顿
  2. 上面执行过程只是 chrome 的,safri 又不太一样

执行过程的示例 :

如何模拟 Promise.then

new MutationObserver(function() {    console.log('mutate');}).observe(document.body, {    attributes: true});document.body.setAttribute('data-random', Math.random());setTimeout(function() {    console.log('timeout');}, 0);new Promise((resolve, reject) => {    console.log('promise');    resolve();}).then(function() {    console.log('then');});console.log('global');

输出: promise 、global、mutate、 then、timeout

参考文章:

  • microTask:
  • es-promise :

转载地址:http://gacta.baihongyu.com/

你可能感兴趣的文章
玩转Edas应用部署
查看>>
music-音符与常用记号
查看>>
sql操作命令
查看>>
zip 数据压缩
查看>>
Python爬虫学习系列教程
查看>>
【数据库优化专题】MySQL视图优化(二)
查看>>
【转载】每个程序员都应该学习使用Python或Ruby
查看>>
PHP高级编程之守护进程,实现优雅重启
查看>>
PHP字符编码转换类3
查看>>
rsync同步服务配置手记
查看>>
http缓存知识
查看>>
Go 时间交并集小工具
查看>>
iOS 多线程总结
查看>>
webpack是如何实现前端模块化的
查看>>
TCP的三次握手四次挥手
查看>>
关于redis的几件小事(六)redis的持久化
查看>>
webpack4+babel7+eslint+editorconfig+react-hot-loader 搭建react开发环境
查看>>
Maven 插件
查看>>
初探Angular6.x---进入用户编辑模块
查看>>
计算机基础知识复习
查看>>