From f5de26f6cd739788852ebb4cb6f9d0d6c3c7d835 Mon Sep 17 00:00:00 2001 From: deyihu Date: Mon, 15 Jan 2024 17:21:15 +0800 Subject: [PATCH] worker idle support idleForceTimeThreshold --- src/GlobalConfig.js | 2 ++ src/core/MicroTask.js | 17 +++++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/GlobalConfig.js b/src/GlobalConfig.js index cb073cb0d8..df7c989f0c 100644 --- a/src/GlobalConfig.js +++ b/src/GlobalConfig.js @@ -7,6 +7,8 @@ const GlobalConfig = { idleLog: false, //idle 时间阈值 idleTimeRemaining: 8, + //idle 申请不到idle时,强制执行时间阈值 + idleForceTimeThreshold: 100, //idle 超时阈值 idleTimeout: 1000, //worker 数量 diff --git a/src/core/MicroTask.js b/src/core/MicroTask.js index f9a11e63a8..2c1042add7 100644 --- a/src/core/MicroTask.js +++ b/src/core/MicroTask.js @@ -1,6 +1,6 @@ import PromisePolyfill from './Promise'; import { requestAnimFrame } from './util'; -import { isFunction, isNil, isNumber } from './util/common'; +import { isFunction, isNil, isNumber, now } from './util/common'; import { getGlobalWorkerPool } from './worker/WorkerPool'; import Browser from './Browser'; import GlobalConfig from '../GlobalConfig'; @@ -87,8 +87,9 @@ function loop() { broadcastIdleMessage = !broadcastIdleMessage; } +let loopFrameTime = now(); function frameLoop(deadline) { - const { idleTimeRemaining, idleLog, idleTimeout } = GlobalConfig; + const { idleTimeRemaining, idleLog, idleTimeout, idleForceTimeThreshold } = GlobalConfig; if (Browser.requestIdleCallback) { if (deadline && deadline.timeRemaining) { const t = deadline.timeRemaining(); @@ -97,8 +98,16 @@ function frameLoop(deadline) { console.error('idle timeout in', idleTimeout); } loop(); - } else if (t <= idleTimeRemaining && idleLog) { - console.warn('currrent page is busy,the timeRemaining is', t); + loopFrameTime = now(); + } else { + const time = now(); + if (time - loopFrameTime > idleForceTimeThreshold) { + loop(); + loopFrameTime = now(); + } + if (t <= idleTimeRemaining && idleLog) { + console.warn('currrent page is busy,the timeRemaining is', t); + } } } requestIdleCallback(frameLoop, { timeout: idleTimeout });