requestIdleCallback和setImmediate之间的区别是什么?

8

目前有两种不同的API旨在将任务分解为计划的回调函数。

据我所知,目前没有JavaScript运行时(浏览器或Node)同时实现了这两个功能。

我想更好地了解这两个功能的比较。我意识到requestIdleCallback有一个timeout选项,可以用来允许浏览器决定何时调用它,并将IdleDeadline对象传递给回调函数,而setImmediate则传递任何提供的参数,但除此之外,这些API有什么区别呢?

例如,以下两个示例是否在功能上相同?

setImmediate(function() {
    // Do something.
});

requestIdleCallback(function() {
    // Do something.
}, {timeout: 0});

在多个回调已注册但第一个回调运行时间超过空闲时间的情况下该怎么办?

@JaromandaX 您的意思是,如果没有 timeout: 0,它们更相似吗?这似乎是违反直觉的。另外,请不要忘记只有 setImmediate 的 Node。 - Alexander O'Mara
关于 Node 的问题 - 是的,但你说过“目前没有浏览器同时实现这两个功能”,这表明你甚至不关心 Node - 让我们面对现实吧,如果想要在所有浏览器中使用两种方法来适当地实现相同的结果,那么 Node 所做的是无关紧要的。 - Jaromanda X
嗯,有趣,也许它更类似于timeout:0 - Jaromanda X
1
我认为问题在于运行时如何判断它是否处于“空闲”状态。是否有正式的定义? - apple apple
我不确定。例如,如果一个函数需要在下一帧执行,它仍然是“空闲”的吗? - apple apple
显示剩余5条评论
2个回答

3

setTimeout会等待一段时间后执行回调函数。

requestIdleCallback会等待主线程空闲后再执行回调函数。这意味着它不会减慢动画的速度,用户仍然可以点击按钮和输入。

如何在setTimeout和requestIdleCallback之间选择?当必须执行回调时最好使用setTimeout(例如:向分析服务器发送数据或注销用户)。当您不想以执行回调为代价损害用户体验时,最好使用requestIdleCallback(例如:重新呈现DOM)。

请记住,requestIdleCallback仍处于试验阶段。


requestIdleCallback没有“等待这么长时间再运行回调”的参数 - 这意味着最好将其与非时间关键的常规任务结合起来? - olejorgenb
如果你的意思是使用 setTimeout 来延迟执行,然后使用 requestIdleCallback 来保持一切流畅,那么我认为这是可行的。 - Adam Genshaft

0

document.visibilityState === 'hidden' 时,requestIdleCallback 不会执行,而当它变为 visible 时,它将一次性执行所有回调。

至少在 Electron 的浏览器视图中是如此。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接