8.实现一个sleep函数

Posted 不想做混子的奋斗远

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8.实现一个sleep函数相关的知识,希望对你有一定的参考价值。

实现一个sleep函数

①利用堵塞循环实现,因为js是单线程的,所以这个其实就是根本上的sleep

function sleep(delay) 
  var start = (new Date()).getTime();
  while ((new Date()).getTime() - start < delay) 
    continue;
  


function test() 
  console.log(\'111\');
  sleep(2000);
  console.log(\'222\');


test()

②定时器实现

function sleep1(ms, callback) 
                setTimeout(callback, ms)
            
            //sleep 1s
            sleep1(1000, () => 
                console.log(1000)
            )

③es6异步处理

const sleep = time => 
 return new Promise(resolve => setTimeout(resolve,time)
 )  
 sleep(1000).then(()=> console.log(1) )

④yield后面是一个生成器 generator

function sleepGenerator(time) 
    yield new Promise(function(resolve,reject)
        setTimeout(resolve,time);
     ) 
 
sleepGenerator(1000).next().value.then(()=>console.log(1)) 

⑤es7---- async/await是基于Promise的,是进一步的一种优化

function sleep(time) 
    return new Promise(resolve =>
      setTimeout(resolve,time)
 )  async function output() 
    let out = await sleep(1000); 
    console.log(1); 
    return out;
 
output();

注意点:

async用来申明里面包裹的内容可以进行同步的方式执行,await则是进行执行顺序控制,每次执行一个await,程序都会暂停等待await返回值,然后再执行之后的await。
await后面调用的函数需要返回一个promise,另外这个函数是一个普通的函数即可,而不是generator。
await只能用在async函数之中,用在普通函数中会报错。
await命令后面的 Promise 对象,运行结果可能是 rejected,所以最好把 await 命令放在 try…catch 代码块中。
其实,async / await的用法和co差不多,await和yield都是表示暂停,外面包裹一层async 或者 co来表示里面的代码可以采用同步的方式进行处理。不过async / await里面的await后面跟着的函数不需要额外处理,co是需要将它写成一个generator的。

 

以上是关于8.实现一个sleep函数的主要内容,如果未能解决你的问题,请参考以下文章

手写一个LazyMan,实现sleep机制

js 实现sleep函数

mysql sleep线程过多

Qt实现延时sleep函数功能

windows 内核中如何实现Sleep

sleep实现原理