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 });