当前位置: 首页 > 后端技术 > Node.js

setTimeout和setInterval的区别和nodejs的区别

时间:2023-04-03 20:01:38 Node.js

博文地址setTimeout和setIntervalsetTimeout和setInterval是我们在javaScript中经常使用的定时器,setTimeout方法用于在指定的毫秒数后调用一个函数或者计算一个表达式,setInterval可以根据指定的周期连续调用一个函数或者计算一个表达式。但是当我们想循环调用某个任务的时候,我们可以使用setInterval来指定周期,也可以使用函数中嵌套的setTimeout来返回给我们自己,可以看下面这段代码//AfunctionmyTimeout(){doStuff()setTimeout(myTimeout,1000)}myTimeout()//BfunctionmyTimeout(){doStuff()}myTimeout()setInterval(myTimeout,1000)上面方法A和B都是循环执行myTimeout函数,但是有是一个有什么区别。我们大多数人都知道,它实际上取决于doStuff所消耗的时间。如下图所示,如果doStuff消耗的时间很短(实际中大部分消耗的时间很短,很难检测到),当doStuff是一个非常复杂的计算时,两种方法的效果差不多耗时较长,我们可以分析方法A(通过setTimeout恢复)可以保证每次任务结束到下一个任务开始的时间间隔是我们的期望值,但是B(setInterval)却可以保证任务开始到下一个任务开始的间隔就是我们的期望值,(当然,如果doStuff执行时间比我们期望的间隔长,setInterval可能会直接放弃某个任务。在这种极少数情况下,我们暂时不考虑)为了感受差异,这里有一个模拟任务执行的函数functionwait(time){varstart=Date.now()while(Date.now()-start=1&&repeat<=TIMEOUT_MAX))repeat=1;//如果这里的间隔小于1或者大于TIMEOUT_MAX(2^31-1),则计算为1vartimer=newTimeout(repeat,callback,args);timer._repeat=重复;//增加了_repeat属性,表示需要循环调用...returntimer;}//当函数返回时,可以看到是在ontimeout函数中执行的functiontryOnTimeout(timer,list){...尝试{ontimeout(定时器);扔=假;}finally{if(timerAsyncId!==null){if(!threw)...}...}//ontimeout函数ontimeout(timer){varargs=timer._timerArgs;varcallback=timer._onTimeout;if(typeofcallback!=='function')returnpromiseResolve(callback,args[0]);如果(!args)timer._onTimeout();else{switch(args.length){案例1:timer._onTimeout(args[0]);休息;情况2:timer._onTimeout(args[0],args[1]);休息;情况3:timer._onTimeout(args[0],args[1],args[2]);休息;默认值:Function.prototype.apply.call(回调,计时器,args);}}if(timer._repeat)//添加定时器rearm(timer);,可以看到ontimeout的额外循环函数中,里面有很多判断参数个数的内容,可以忽略。最后的if(timer._repeat)rearm(timer)判断是否循环调用。可以看到是在上面的timer._onTimeout执行完之后才开始的。执行上和我们一开始写的A方法基本类似(用setTimeout返回),nodejs的区别到此就可以理解了。看issues,这个问题讨论很多,很多人还是想改成大家熟悉的方法.参考资料nodejs源码setTimeout还是setInterval?深入理解JavaScript的setTimeout和setInterval