javascript 中实现 sleep 研究

javascript 中实现sleep

因为javascript 是单线程,异步,所以并没有 像其他语言的sleep内置函数,javascript 里实现流程 暂停,睡觉,可以参考如下两种方式

//second 是秒
const sleep = (second:number) =>{
  return new Promise((resolve)=>{
    setTimeout(()=>{
      resolve(true)
    }, second*1000)
  })
}
const main =  async () =>{
 
  console.log("  当前时间:", new Date())
  await sleep(2)
  console.log("2秒后 时间:", new Date())
  await sleep(4)
  console.log("4秒后 时间:", new Date())

  sleep(6).then(()=>{
    console.log("6秒后 时间:", new Date())
  })

}

打印结果:
在这里插入图片描述
结果看上去,也没什么大问题,实现起来很简单,,暂停时间间隔基本都是按照设置的时间,在暂停。能满足大部分需求。
但是,上面并非绝对精准,因为 setTimeout 这类函数的回调函数,会脱离主进程,被安排在 子进程中排队等候处理,然后等待轮询,排到了就立即处理,大概率就会出现延时现象,所以,上面的打印结果,整数秒后面的毫秒值,是有差值的

在这里插入图片描述
一旦,子进程中等候处理的前一个耗时更长,比如 IO处理,这里的延迟会更大,我们再换一种方式实现

//second 是秒
function sleep(ms){
  ms *=1000;
  var start=Date.now(),end = start+ms;
  while(Date.now() < end);
  return;
}
const main =  async () =>{
  console.log("  当前时间:", new Date())
  await sleep(2)
  console.log("2秒后 时间:", new Date())
  await sleep(4)
  console.log("4秒后 时间:", new Date())
  await sleep(6)
  console.log("6秒后 时间:", new Date())
}

打印结果:
在这里插入图片描述
这样结果会更加精准一些。用 while循环,一旦达到延迟后的时间点,立即执行

这样虽然更精准,但是不适用暂停太长时间,因为暂停的时间,while是在不断循环,会消弱cpu处理其他事务的能力,这里看的还不是很清楚,我们把在循环里打印一些信息,看看

function sleep(ms){
  let i = 0;
  ms *=1000;
  var start=Date.now(),end = start+ms;
  while(Date.now() < end){i++; console.log("循环次数", i)}
  return;
}

打印结果:
在这里插入图片描述
最后一个6秒的等待,循环计算了 5万多次

总结:两种方法,各有摄取,
如果精度不是很高,用第一种;
如果时间短,精度高,用第二种

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值