当前位置: 首页 > news >正文

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

前言

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

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

实现

初步想法是变为Promise即可

function asyncRun(func) {Promise.resolve().then(func)
}

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

function asyncRun(func) {if (typeof setImmediate === "function") {Promise.resolve().then(func)}
}

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

在这里插入图片描述

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

使用方法如下

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

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

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确实会放入微队列。

在这里插入图片描述


http://www.mrgr.cn/news/19739.html

相关文章:

  • Spring 状态机
  • Serverless 应用引擎 SAE 助力袋拉拉研发提效 70%
  • 深度学习|模型推理:端到端任务处理
  • 前端入门了解
  • Pencils Protocol生态新进展,即将上线 Vault 产品
  • 23合并 K 个升序链表
  • 【python】Python如何通过线程池来提高程序的执行效率
  • Python中的self有什么作用
  • Java重修笔记 第四十六天 Map 接口、HashMap 类
  • 硬件工程师笔试面试知识器件篇——三极管
  • 2024年百度嵌入式面试题及参考答案(7万字长文)
  • C++中STL容器
  • 【YOLOv8系列】YOLOv8的GUI界面设计;在电脑本地实现YOLOv8的可视化交互界面设计(对摄像头的实时画面进行分类)
  • Ajax是什么?如何在HTML5中使用Ajax?
  • 提升多跳问答中的语言模型知识编辑能力
  • 828华为云征文|华为云Flexus X实例部署k3s与kuboard图形化管理工具
  • SD-WAN组网:定义与部署步骤解析
  • Visual Studio+Qt配置开发环境
  • 【进阶】面向对象之继承(二)
  • 使用 VS Code 正则表达式批量替换:将 `this.xxx` 改为 `xxx.value`