js中不存在自带的sleep方法,要想休眠要自己定义个方法
在几乎所有情况下,尝试在javascript中实现 sleep函数都会产生不必要的副作用,
即冻结整个浏览器 freezing the entire browser.
应该始终选择本机setTimeout()或setInterval()函数
http://devcheater.com/

将应用程序的当前线程暂停指定毫秒(毫秒),不应该阻塞其他进程(或线程)继续

  1. async function test() {
  2. console.log(100)
  3. await sleep(1000)
  4. console.log(200)
  5. await sleep(1000)
  6. console.log(300)
  7. }
  8. function sleep(ms=0) {
  9. return new Promise(resolve => setTimeout(resolve, ms))
  10. }
  11. test()
  12. const promise = new Promise(resolve => resolve())
  13. .then(sleep(2000))
  14. .then(() => {
  15. console.log('after 2000')
  16. })
  17. 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

  1. <a name="PJ0td"></a>
  2. ## npm sleep包
  3. [https://www.npmjs.com/package/sleep](https://www.npmjs.com/package/sleep)<br />sleep包是C++编写,然后扩展到Node来实现sleep函数
  4. - `sleep.sleep(n)`: sleep for `n` **seconds 秒**
  5. - `sleep.msleep(n)`: sleep for `n` **miliseconds 毫秒**
  6. - `sleep.usleep(n)`: sleep for `n` microseconds (**1 second is 1000000 microseconds) 微妙**
  7. ```bash
  8. const sleep = require('sleep');
  9. console.log('1');
  10. console.time('runTime:');
  11. sleep.sleep(2); //休眠2秒钟
  12. console.log('2');
  13. sleep.msleep(1000); //休眠1000毫秒
  14. console.log('3');
  15. sleep.usleep(1000000) //休眠1000000微秒 = 1秒
  16. console.log('4');
  17. console.timeEnd('runTime:');
  18. // 1
  19. // 2
  20. // 3
  21. // 4
  22. // runTime:: 4014.455ms

sleep错误的写法

while 循环的写法,会把其他的js方法阻塞掉,还有可能导致浏览器假死,或者提示脚本无响应

while 不断循环,直到达到指定时间

  • 代码并没有让脚本sleep下来, 相反让CPU迅速上到高负荷的附作用
  • 多数现代浏览器会在该段时间内处于假死状态
  • 阻塞当前的线程执行,消耗宝贵的cpu资源
  1. function sleep(delay) {
  2. var start = new Date().getTime();
  3. while (new Date().getTime() < start + delay);
  4. }
  5. function sleep(d){
  6. for(let t = Date.now();Date.now() - t <= d;);
  7. }
  8. sleep(3000)
  9. console.log(123)

xhr

用xhr同步请求后台程序

  • 比如传2000过去,后台就sleep 2秒后再返回
  • 缺点,当N多客户端都请求后台时,一直保持连接http开销很大

IE特殊的对话框

只有IE支持,IE7因为安全限制也而不能达到目的

  1. function sleep(timeout) {
  2. window.showModalDialog("javascript:document.writeln('<script>window.setTimeout(function () { window.close(); }, " + timeout + ");<\/script>');");
  3. }
  4. window.alert("before sleep ...");
  5. sleep(2000);
  6. window.alert("after sleep ...");