【JS笔试题】模拟一个微任务

前言

这是一道腾讯面试题,要求如下,如果不了解微任务,可以看我另一篇文章结合Chrome文档详解事件循环

javascript 复制代码
/**
 * 异步执行一个函数
 * 如果可以,尽量将函数放入到微队列中
 * @param {Function} func 无参无返回 
 */
function asyncRun(func) {
  
}

实现

初步想法是变为Promise即可

javascript 复制代码
function asyncRun(func) {
  Promise.resolve().then(func)
}

但有不妥,仔细观察题目中的「如果可以」了解到可能有的浏览器并不支持Promise,继续优化。

javascript 复制代码
function asyncRun(func) {
  if (typeof setImmediate === "function") {
    Promise.resolve().then(func)
  }
}

继续分析,vue中的nextTick也实现了将函数放入微队列。查看vue源码发现,vue的处理为如果支持Promise则使用,否则使用MutationObserver

MutationObserver是什么?根据mdn文档说明可知,MutationObserver用于监听dom节点的变化。

使用方法如下

javascript 复制代码
const ob = new MutationObserver(()=>{console.log('change')})
ob.observe(domNode,{ characterData: true })

继续优化代码,手动触发dom变化,那么func就会被加入微队列。

javascript 复制代码
function asyncRun(func) {
  if (typeof setImmediate === "function") {
    Promise.resolve().then(func)
  } else if(typeof MutationObserver !== 'undefined'){
  	const ob = new MutationObserver(fnc)
  	const textNode = document.createTextNode('0')
	ob.observe(textNode,{ characterData: true })
	textNode.data = '1' 
  }
}

通过w3c文档可知,MutationObserver确实会放入微队列。

相关推荐
gaohe26AIliuzeyu1 分钟前
Java内部类
java·开发语言
AI科技星3 分钟前
数术工坊・八卷全书(番外・实战升华副卷)【终极典藏定稿|完整无删减】
c语言·开发语言·网络·量子计算·agi
丘山望岳4 分钟前
剑起霜华——平衡二叉树(AVL树 )精讲
开发语言·数据结构·c++
yyuuuzz5 分钟前
云服务器软件部署的几个常见问题
运维·服务器·开发语言·网络·云计算·php·apache
z落落8 分钟前
Timer与DateTimePicker:控件使用全解析
开发语言·c#
Boom_Shu19 分钟前
浅拷贝与深拷贝
开发语言·c++·算法
2601_9618451525 分钟前
2026法考资料pdf|电子版|资料已整理
开发语言·前端框架·pdf·c#·xhtml·csrf·view design
何以解忧,唯有..25 分钟前
Go 语言数据类型详解:从基础到复合类型
开发语言·golang·mfc
Mortalbreeze28 分钟前
C++ Lambda表达式详解:从捕获列表到底层原理
开发语言·c++
MATLAB代码顾问34 分钟前
Python NumPy数值计算核心指南
开发语言·python·numpy