今天发现了一个比较有趣的事,相信很多人遇到过写while循环时,在测试时很容易陷入死循环,导致要关闭页面再重启才能继续测试,那如果频繁调试,就每死循环一次就重启一次,很烦! 所以想写一个到一定时间就终止循环的函数,刚开始用setTimeout的方式来写,想法是到指定时间,到时间后就break终止循环;但是后来发现setTimeout是异步方法,导致函数还是陷入了死循环。 然后想到了用另一种方法解决,既然无法用异步方法终止,那就利用获取系统时间的方式来终止,大概思路是这样的:函数刚开始时保存当前时间,之后每循环一次就获取一次时间,直到循环已经过去一段时间了后返回一个设置时间已到的标记位,让while一直判断标记,达成条件就终止循环。 代码如下:
var date1 = new Date(); var currMS = date1.getMilliseconds(); //当前系统的毫秒值 let miao = date1.getSeconds(); //当前秒 var flag = true; //设置一个标记 while (flag) { console.log("循环中...") flag = overLoop(100) if (!flag) { console.log("循环终止") } } //结束循环函数 该函数传入的时间参数最大只能1000 单位为毫秒 当返回false表示定时的时间已经到了 function overLoop(ms) { var date = new Date(); // console.log("开始计时毫秒值:" + currMS + ";当前系统毫秒值:" + date.getMilliseconds()) //currms+ms<1000的时 if (date.getSeconds() == miao && date.getMilliseconds() >= currMS + ms) { return false; } //currms+ms>1000的时 if (date.getSeconds() != miao && date.getMilliseconds() > currMS + ms - 1000) { return false; } return true; }该方法有个缺点就是会消耗一些cpu资源,不过用于测试问题不大。 我觉得应该还有更好的方法,但不能使用异步的话只能想到这个看过来有些蠢的方法。