想象一下,你在一家很火的餐厅当服务员。突然来了一个大团餐订单,你要是埋头只顾着处理这一个订单,其他桌的客人就会觉得被冷落了,开始敲桌子催单。
网页应用也是这个道理。当主线程上有个长任务在埋头苦干时,浏览器就没法及时响应用户的点击和输入,页面就会变得像蜗牛一样慢,甚至直接卡住。
这时候就该 scheduler.yield()
出场了------它就像个聪明的服务员,懂得适时地说:"我先去招呼一下其他客人,马上回来继续处理您的大订单!"
1. 为什么要用 scheduler.yield()
?
如果你有个大函数在做繁重的工作,它会把主线程占着不让干别的活,比如响应点击事件。
当你在异步函数里加上 await scheduler.yield()
时:
- 函数会在那个点暂停一下
- 浏览器先去处理其他紧急任务
- 然后你的函数在新的循环回合中继续执行
javascript
async function 用户点击处理() {
显示即时反馈(); // 👌 快速UI更新
await scheduler.yield(); // 给主线程喘口气
执行繁重工作(); // 🛠️ 慢活放在后面
}
最妙的是:你的函数剩余部分会在其他类似任务之前运行。这意味着你的后续代码比新来的任务有更高的优先级。
2. 它和 setTimeout()
或 scheduler.postTask()
有什么不同?⏱️
你也可以用 setTimeout
或 scheduler.postTask
来拆分长任务。但在那些情况下,你的剩余代码可能会在很多其他任务之后才运行,这就会导致延迟。
用 setTimeout
的例子:
javascript
function 大任务() {
第一部分();
setTimeout(第二部分, 0); // 稍后运行
}
如果已经有其他任务(比如 其他任务
)在排队了,你的 第二部分
就要等到 其他任务
完成后才能运行。如果 其他任务
很慢,你的代码就得等更久。
用 scheduler.yield()
:
javascript
async function 大任务() {
第一部分();
await scheduler.yield();
第二部分();
}
这时候浏览器会:
- 先让其他紧急任务跑完
- 然后优先 回来执行你的
第二部分
,而不是开始新的普通任务
结果就是 → 页面保持响应,你的工作也能更快完成。
3. 为什么在开发者工具里显示为"运行微任务"?
scheduler.yield()
返回一个 promise。当函数继续时,它是在微任务 中执行的(就像普通的 await
那样)。
如果你看 Babel 编译后的异步代码,它会把 await
的结果放在 Promise.resolve(...).then(...)
里面。所以你会先看到"运行微任务",然后才是你的代码继续执行。
4. 和 scheduler.postTask()
一起使用 📋
scheduler.yield()
也可以在 scheduler.postTask()
任务里面使用。 如果你不设置优先级,它的工作方式就和上面的例子一样。
如果你设置了低优先级 (比如 "background"
),那么即使在 yield 之后,你的后续代码仍然比其他普通任务的优先级低。
例子:
javascript
async function 慢速后台工作() {
前半部分();
await scheduler.yield();
后半部分();
}
scheduler.postTask(慢速后台工作, { priority: "background" })
这里会发生:
- 它仍然会在其他后台任务之前运行
- 但会先等高优先级任务完成
你也可以用 scheduler.postTask
来延迟任务:
javascript
scheduler.postTask(() => {
console.log("大约2秒后运行");
}, { delay: 2000 });
5. 什么时候使用它?✅
- 拆分大的 JavaScript 任务,让 UI 能够响应
- 改善输入延迟(提高 INP 分数)
- 给其他重要工作机会运行,但同时保持自己的任务优先级较高
💡 小贴士 :可以把 scheduler.yield()
想象成对浏览器说:
"我先让一让,但请让我在新任务开始前先完成我的工作。"
就像那个聪明的餐厅服务员,懂得在忙碌中保持所有客人都满意,而不是只顾着一桌客人让其他人都等着急。
下次当你发现网页应用有点卡顿时,记得请出 scheduler.yield()
这个得力助手,让你的应用保持流畅如丝!
原文链接 : rexai.top/js-news/sch...
觉得这篇文章有帮助吗?
欢迎关注我的技术博客,获取更多前端性能优化和 JavaScript 开发技巧。我会持续分享实用的编程知识和最新的技术动态,帮助你在开发路上少走弯路!
如果你有其他关于性能优化的问题,或者想了解更多的 JavaScript 开发技巧,欢迎在评论区留言讨论。我们一起学习,共同进步!