是不是因为JavaScript是单线程的,所以要实现sleep很困难?

sleep这个东西在c,或Linux编程中,直接调用就行了,可是JavaScript是不支持的,都没有提供,看了一些c的实现原理,猜测是不是因为JavaScript是单线程的,所以在实现上有一些难度,导致没有提供这样的方法?

这个问题是不是要结合好几个方面才能有一个准确的答案,基础尤其是C这边有点差,求大佬帮忙解答一下

阅读 2.8k
4 个回答

这只是刻意的设计。
js是单线程的,但是否提供这样的功能取决于引擎实现,想实现一个很容易。比如用NodeJS加个拓展就行。
然而如果提供了这样的功能,就会导致卡住主线程(像window.alert()那样),页面中的其他js都无法运行和正常交互,极大影响用户体验。

也可以用最新的async语法,能达到类似的效果,不会卡住页面主线程,目前是最好的解决方案:

async function sleepAsync (time) {
  return new Promise(resolve => setTimeout(resolve, time))
}

(async()=>{
  console.log(1)
  await sleepAsync(1000)
  console.log(2)
})()

这个问题明明问的很有意义,目前最好的解决方法就是async,用while的都大有人在,还被人踩了,真是服了,算了,我还是安心的做后端吧

又踩我,我在社区待了这么久,真服了,你们搞前端的都这么心高气傲吗,有种的来评论区说话,一门语言连个sleep都没有,还骄傲了

JavaScript 是事件驱动的,任务队列有任务的时候就执行,执行完之后,你就可以当它是处于永久的 wait 状态,只在有新事件到来的时候才会继续执行新任务队列里的新任务。JavaScript 是为交互而生的,用上阻塞的话,整个交互体验不知道得有多差,所以浏览器把定时、计时这些任务包揽了,wait已经足够,sleep就是画蛇添足。
困不困难和线程数没有关系,单线程当然可以轻易地 sleep,只要一直阻塞线程直到指定的时间就可以了。
JavaScript 的 sleep 可以这样模拟实现:

const stampGen = () => (new Date()).valueOf();
const sleep = (millis = 1000) => {
    const start = stampGen();
    while(stampGen() - start < millis){
    }
};

但是,不只是 JavaScript,相信在任何语言开发的程序中,主线程的 sleep 都应当谨慎地使用,不然很可能闹出这样的笑话

语言本身不提供sleep api,如果你想达到效果,只能写
while循环

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题