一个模块:forceinterval,可无缝替换许多 setInterval 的场景
发布于 3 年前 作者 alsotang 2199 次浏览 来自 分享

给 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

1 回复

好东西,GET了。

回到顶部