源码:

		const callbacks = []
let pending = false function flushCallbacks () {
pending = false
const copies = callbacks.slice(0)
callbacks.length = 0
for (let i = 0; i < copies.length; i++) {
copies[i]()
}
}
let timerFunc
if (typeof Promise !== 'undefined' && isNative(Promise)) {
const p = Promise.resolve()
timerFunc = () => {
p.then(flushCallbacks)
if (isIOS) setTimeout(noop)
}
isUsingMicroTask = true
} else if (!isIE && typeof MutationObserver !== 'undefined' && (
isNative(MutationObserver) ||
MutationObserver.toString() === '[object MutationObserverConstructor]'
)) {
let counter = 1
const observer = new MutationObserver(flushCallbacks)
const textNode = document.createTextNode(String(counter))
observer.observe(textNode, {
characterData: true
})
timerFunc = () => {
counter = (counter + 1) % 2
textNode.data = String(counter)
}
isUsingMicroTask = true
} else if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) {
timerFunc = () => {
setImmediate(flushCallbacks)
}
} else {
timerFunc = () => {
setTimeout(flushCallbacks, 0)
}
} export function nextTick (cb?: Function, ctx?: Object) {
let _resolve
callbacks.push(() => {
if (cb) {
try {
cb.call(ctx)
} catch (e) {
handleError(e, ctx, 'nextTick')
}
} else if (_resolve) {
_resolve(ctx)
}
})
if (!pending) {
pending = true
timerFunc()
}
if (!cb && typeof Promise !== 'undefined') {
return new Promise(resolve => {
_resolve = resolve
})
}
}

  总体来说:就是先判断是否支持promise,如果支持promise。就通过Promise.resolve的方法,异步执行方法,如果不支持promise,就判断是否支持MutationObserver。如果支持,就通过MutationObserver(微异步)来异步执行方法,如果MutationObserver还不支持,就通过setTimeout来异步执行方法。

  MutaionObserver通过创建新的节点,调用timerFunc方法,改变MutationObserver监听的节点变化,从而触发异步方法执行。

最新文章

  1. django进阶
  2. Mysql 拼接字段查询语句和join查询拼接和时间查询
  3. Python的高级特性11:拓展基本数据类型(dict)
  4. HTML标签的应用(新手)
  5. bzoj1670 Usaco2006 Building the Moat护城河的挖掘 [凸包模板题]
  6. iOS应用架构现状分析
  7. swift 委托代理传值
  8. 终于用scons创建了一个MDK工程
  9. android 分辨率自适应
  10. 有个程序猿要去当CEO了:(二)扬帆起航
  11. 关于OPC UA Helper 命名空间中的OpcUaClient 类中的订阅函数的更改
  12. ln语法
  13. BOM模型中常用对象 定义计数器 网页跳转 网页前进后退
  14. servlet中的request和response
  15. poj 3276(反转)
  16. django-Q模块实现查询
  17. jQuery 实现 bootstrap 模态框 删除确认
  18. 一种开源的分布式消息系统Nats
  19. YAML中重复的KEY的判断
  20. wxpython 编程触发菜单或按钮事件

热门文章

  1. Lambda@edge 实现负载均衡器功能
  2. 稚晖君-最小linux服务器运行 nginx + netcore
  3. 20210819 Emotional Flutter,Medium Counting,Huge Counting,字符消除2
  4. openswan中的in_struct和out_struct函数
  5. Redis-数据类型-应用场景
  6. React Native踩坑日记 —— tailwind-rn
  7. HCNP Routing&amp;Switching之IS-IS路由渗透和开销
  8. 迷宫2----BFS
  9. 字符串出现的topK问题
  10. Markdown公式用法大全