给 lodash 提了个 issue 被拒了(https://github.com/lodash/lodash/issues/2616)。。自己发个包算了:https://www.npmjs.com/package/forceinterval。
在使用 setInterval(fn, time)
的场景中,如果 js 的 main loop 被 cpu 密集工作阻塞时,fn
在阻塞时间内会无法执行。
假如在页面上有一个时钟,每秒秒针更新一次,这时页面由于繁重的计算阻塞了2s的话,那么这个时钟就会比实际的时间晚2s。自己写动画的场景中也存在这个问题。
用了 forceinterval
之后:
var forceinterval = require('forceinterval')
var count = 0;
forceinterval(function addTask() {
count++;
}, 100)
var startTime = +new Date()
while ((new Date - startTime) < 1000) {}
setTimeout(function () {
// !!!This is the point. After block,
// forceinterval auto run `addTask` 10 times.
assert(count == 10)
done()
}, 50)
我们可以看到,虽然 forceInterval 在启动之后马上被阻塞了 1s,但是当它有机会再次执行时,它会自动计算自己与上一次时间之间隔了几个 interval,并重复执行 fn 多次,从而追上进度。
写这个库的测试时,还发现了一个 nodejs 的 bug,目测 v4 v5 v6 都存在:https://github.com/nodejs/node/issues/8354