因为对接集成硬件需要遇到需要在for循环中实现休眠效果,以前遇到过类似问题,当时想到用setTimeout发现js不支持会得到有意思的结果参考如下
1 function test(){ 2 for(let i = 0; i<10; i++){ 3 setTimeout(function(){ 4 console.log(i); 5 },1000) 6 } 7 }
执行后会是一秒后打印10个10,当时主要需要解决异步问题,后来用promise解决,但本次对接又无法修改硬件控件代码,在网上找到的方法如下
1 //参数n为休眠时间,单位为毫秒: 2 function sleep(n) { 3 var start = new Date().getTime(); 4 // console.log('休眠前:' + start); 5 while (true) { 6 if (new Date().getTime() - start > n) { 7 break; 8 } 9 } 10 // console.log('休眠后:' + new Date().getTime()); 11 }
在for循环中调用sleep可以实现休眠效果,但是会一直占用资源,后来想到用递归是不是也能实现类似的效果呢,代码如下
1 // 调用时触发 初始值传参为0 2 function test(i) { 3 if (i < 10) { 4 console.log(i); 5 setTimeout(function() { 6 test(i + 1); 7 }, 1000) 8 } 9 }
使用递归可以实现同样的效果,测试对cpu占用率也不高,对本次需求来说是较为好的解决方案。