js中不存在自带的sleep方法,要想休眠要自己定义个方法
在几乎所有情况下,尝试在javascript中实现 sleep函数都会产生不必要的副作用,
即冻结整个浏览器 freezing the entire browser.
应该始终选择本机setTimeout()或setInterval()函数
http://devcheater.com/
将应用程序的当前线程暂停指定毫秒(毫秒),不应该阻塞其他进程(或线程)继续
async function test() {console.log(100)await sleep(1000)console.log(200)await sleep(1000)console.log(300)}function sleep(ms=0) {return new Promise(resolve => setTimeout(resolve, ms))}test()const promise = new Promise(resolve => resolve()).then(sleep(2000)).then(() => {console.log('after 2000')})promise()
child_process
将sleep放在子进程中执行,不会影响其他进程
- 通过childProcess对象的 execFileSync或者 spawnSync创建一个同步进程
- 在同步进程中执行定时器,定时器执行完毕后回收进程,程序继续执行 ```javascript var childProcess = require(‘child_process’); var nodeBin = process.argv[0];
function sleep(time) { childProcess.execFileSync(nodeBin, [‘-e’, ‘setTimeout(function() {}, ‘ + time + ‘);’]); }
console.time(‘runTime:’); console.log(‘1’);
sleep(1000); console.log(‘2’);
sleep(2000); console.log(‘3’); console.timeEnd(‘runTime:’);
// 1 // 2 // 3 // runTime:: 3579.093ms
<a name="PJ0td"></a>## npm sleep包[https://www.npmjs.com/package/sleep](https://www.npmjs.com/package/sleep)<br />sleep包是C++编写,然后扩展到Node来实现sleep函数- `sleep.sleep(n)`: sleep for `n` **seconds 秒**- `sleep.msleep(n)`: sleep for `n` **miliseconds 毫秒**- `sleep.usleep(n)`: sleep for `n` microseconds (**1 second is 1000000 microseconds) 微妙**```bashconst sleep = require('sleep');console.log('1');console.time('runTime:');sleep.sleep(2); //休眠2秒钟console.log('2');sleep.msleep(1000); //休眠1000毫秒console.log('3');sleep.usleep(1000000) //休眠1000000微秒 = 1秒console.log('4');console.timeEnd('runTime:');// 1// 2// 3// 4// runTime:: 4014.455ms
sleep错误的写法
while 循环的写法,会把其他的js方法阻塞掉,还有可能导致浏览器假死,或者提示脚本无响应
while 不断循环,直到达到指定时间
- 代码并没有让脚本sleep下来, 相反让CPU迅速上到高负荷的附作用
- 多数现代浏览器会在该段时间内处于假死状态
- 阻塞当前的线程执行,消耗宝贵的cpu资源
function sleep(delay) {var start = new Date().getTime();while (new Date().getTime() < start + delay);}function sleep(d){for(let t = Date.now();Date.now() - t <= d;);}sleep(3000)console.log(123)
xhr
用xhr同步请求后台程序
- 比如传2000过去,后台就sleep 2秒后再返回
- 缺点,当N多客户端都请求后台时,一直保持连接http开销很大
IE特殊的对话框
只有IE支持,IE7因为安全限制也而不能达到目的
function sleep(timeout) {window.showModalDialog("javascript:document.writeln('<script>window.setTimeout(function () { window.close(); }, " + timeout + ");<\/script>');");}window.alert("before sleep ...");sleep(2000);window.alert("after sleep ...");
