forked from mirrors/catstodon
Improve scheduling of requestIdleCallback tasks (#3477)
This commit is contained in:
parent
3652a39de0
commit
0e12a8dab9
4 changed files with 36 additions and 1 deletions
|
@ -14,6 +14,7 @@ import { FormattedMessage } from 'react-intl';
|
|||
import emojify from '../emoji';
|
||||
import escapeTextContentForBrowser from 'escape-html';
|
||||
import ImmutablePureComponent from 'react-immutable-pure-component';
|
||||
import scheduleIdleTask from '../features/ui/util/schedule_idle_task';
|
||||
|
||||
class Status extends ImmutablePureComponent {
|
||||
|
||||
|
@ -92,7 +93,7 @@ class Status extends ImmutablePureComponent {
|
|||
const isIntersecting = entry.intersectionRatio > 0;
|
||||
this.setState((prevState) => {
|
||||
if (prevState.isIntersecting && !isIntersecting) {
|
||||
requestIdleCallback(this.hideIfNotIntersecting);
|
||||
scheduleIdleTask(this.hideIfNotIntersecting);
|
||||
}
|
||||
return {
|
||||
isIntersecting: isIntersecting,
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
// Wrapper to call requestIdleCallback() to schedule low-priority work.
|
||||
// See https://developer.mozilla.org/en-US/docs/Web/API/Background_Tasks_API
|
||||
// for a good breakdown of the concepts behind this.
|
||||
|
||||
import Queue from 'tiny-queue';
|
||||
|
||||
const taskQueue = new Queue();
|
||||
let runningRequestIdleCallback = false;
|
||||
|
||||
function runTasks(deadline) {
|
||||
while (taskQueue.length && deadline.timeRemaining() > 0) {
|
||||
taskQueue.shift()();
|
||||
}
|
||||
if (taskQueue.length) {
|
||||
requestIdleCallback(runTasks);
|
||||
} else {
|
||||
runningRequestIdleCallback = false;
|
||||
}
|
||||
}
|
||||
|
||||
function scheduleIdleTask(task) {
|
||||
taskQueue.push(task);
|
||||
if (!runningRequestIdleCallback) {
|
||||
runningRequestIdleCallback = true;
|
||||
requestIdleCallback(runTasks);
|
||||
}
|
||||
}
|
||||
|
||||
export default scheduleIdleTask;
|
|
@ -105,6 +105,7 @@
|
|||
"stringz": "^0.2.0",
|
||||
"style-loader": "^0.16.1",
|
||||
"throng": "^4.0.0",
|
||||
"tiny-queue": "^0.2.1",
|
||||
"uuid": "^3.0.1",
|
||||
"uws": "^0.14.5",
|
||||
"webpack": "^2.5.1",
|
||||
|
|
|
@ -6510,6 +6510,10 @@ tiny-emitter@1.0.2:
|
|||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-1.0.2.tgz#8e49470d3f55f89e247210368a6bb9fb51aa1601"
|
||||
|
||||
tiny-queue@^0.2.1:
|
||||
version "0.2.1"
|
||||
resolved "https://registry.yarnpkg.com/tiny-queue/-/tiny-queue-0.2.1.tgz#25a67f2c6e253b2ca941977b5ef7442ef97a6046"
|
||||
|
||||
to-arraybuffer@^1.0.0:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
|
||||
|
|
Loading…
Reference in a new issue