AFAIK,完全依赖 JS,您将得到的最接近的方法是执行以下操作:
var fader = (function(now)
{
var timeLeft, end = now + 1000,//aim for 1000 ms
stepsRemaining = 100,
callBack = function()
{//define here, avoid redefining function objects
doSomething(foo, bar);
setter();
},
setter = function()
{//recompute interval, set anew
if (stepsRemaining <= 0)
{//avoid infinite timeouts
return;
}
timeLeft = (end - (+(new Date)));
timeLeft= timeLeft > 0 ? timeLeft : 0;//ensure positive timeleft, if not, 0 intervals ==> ASAP
fader = setInterval(
callback,
Math.floor(
timeLeft/stepsRemaining--
)
);
};
setter();
return fader;
}(+(new Date)));//get ms now
此代码虽然未经测试,但会预先创建所有函数对象。然后,使用setter
,每次间隔结束时,只要您没有设置 100 个间隔,就会计算新的间隔。工作完成后,由callBack
函数setter
再次调用。在这里,检查剩余步数,然后再次计算 timeLeft 并基于剩余步数,每次调用时减 1 setter
。
为了避免将间隔设置得太长或使用浮点数,我正在调用Math.floor
,并且为了避免设置负超时值,我timeLeft
显然也在检查 的值