JS微队列添加函数方法

在 JavaScript 中,将函数添加到微任务队列(microtask queue)主要有以下两种方法:

1. 使用 Promise.resolve().then()

通过 Promise 的 then 方法可以将回调推入微队列。当 Promise 被解决(resolved)时,回调函数会作为微任务执行:

Promise.resolve().then(() => {
  console.log('这个函数被添加到微队列');
});

特点:

  • 兼容性较好,支持所有实现了 Promise 的环境(包括较旧的浏览器)。
  • 如果回调中抛出错误,会被 Promise 捕获为拒绝(rejection),可能导致未处理的错误。

2. 使用 queueMicrotask() API

现代浏览器提供了专用的 queueMicrotask 方法,直接将函数加入微队列:

queueMicrotask(() => {
  console.log('这个函数被添加到微队列');
});

特点:

  • 语义更清晰,专为微任务设计,避免 Promise 可能的副作用(如错误处理)。
  • 兼容性:支持现代浏览器(Chrome 71+、Firefox 69+、Safari 12.1+、Edge 79+),但 IE 不支持。

如何选择?

  • 推荐 queueMicrotask:在支持的现代环境中优先使用,代码更直观。
  • 降级方案:在不支持 queueMicrotask 时回退到 Promise
if (typeof queueMicrotask !== 'function') {
  queueMicrotask = (fn) => Promise.resolve().then(fn);
}

微任务与宏任务的区别

  • 微任务:在当前宏任务结束后、下一个宏任务开始前执行(如 PromisequeueMicrotaskMutationObserver)。
  • 宏任务:在事件循环的新一轮迭代中执行(如 setTimeoutsetInterval、事件回调)。

示例对比

// 宏任务(宏队列)
setTimeout(() => console.log('宏任务执行'), 0);

// 微任务(微队列)
queueMicrotask(() => console.log('微任务执行'));

输出顺序:

微任务执行
宏任务执行

通过这两种方法,可以确保函数在微任务队列中执行,适用于需要异步但高优先级的场景(如状态更新后立即操作 DOM)。

JavaScript 中,队列通常与 Promise 和 `MutationObserver` 相关。以下是几种使用 JavaScript 创建队列方法: ### 使用 Promise Promise 的 `.then()` 方法会将回调函数添加队列中。当 Promise 状态改变时,其对应的 `.then()` 回调会在队列中等待执行,并且会在当前宏任务执行完后,下一个宏任务开始前执行。 ```javascript console.log('开始'); const promise = new Promise((resolve) => { console.log('Promise 内部'); resolve(); }); promise.then(() => { console.log('Promise 的 then 回调,在队列中执行'); }); console.log('结束'); ``` 在上述代码中,`promise.then()` 里的回调函数会被添加队列中,会在当前同步代码执行完后立即执行。 ### 使用 `queueMicrotask` 函数 `queueMicrotask` 是一个专门用于将回调函数添加队列方法。它会将传入的回调函数加入到队列中等待执行。 ```javascript console.log('开始'); queueMicrotask(() => { console.log('通过 queueMicrotask 添加队列的任务'); }); console.log('结束'); ``` 这里 `queueMicrotask` 里的回调函数会在当前同步代码执行完后立即在队列中执行。 ### 使用 `MutationObserver` `MutationObserver` 也可以用来模拟队列。当 DOM 发生变化时,`MutationObserver` 的回调函数会被添加队列中执行。 ```javascript const targetNode = document.createElement('div'); const observer = new MutationObserver(() => { console.log('MutationObserver 的回调,在队列中执行'); }); const config = { attributes: true }; observer.observe(targetNode, config); targetNode.setAttribute('data-test', 'test'); ``` 在这个例子中,当 `targetNode` 的属性发生变化时,`MutationObserver` 的回调函数会被添加队列中执行。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值