sleep这个东西在c,或Linux编程中,直接调用就行了,可是JavaScript是不支持的,都没有提供,看了一些c的实现原理,猜测是不是因为JavaScript是单线程的,所以在实现上有一些难度,导致没有提供这样的方法?
这个问题是不是要结合好几个方面才能有一个准确的答案,基础尤其是C这边有点差,求大佬帮忙解答一下
sleep这个东西在c,或Linux编程中,直接调用就行了,可是JavaScript是不支持的,都没有提供,看了一些c的实现原理,猜测是不是因为JavaScript是单线程的,所以在实现上有一些难度,导致没有提供这样的方法?
这个问题是不是要结合好几个方面才能有一个准确的答案,基础尤其是C这边有点差,求大佬帮忙解答一下
这个问题明明问的很有意义,目前最好的解决方法就是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 都应当谨慎地使用,不然很可能闹出这样的笑话。
10 回答11.1k 阅读
7 回答5.3k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
3 回答2k 阅读✓ 已解决
这只是刻意的设计。
js是单线程的,但是否提供这样的功能取决于引擎实现,想实现一个很容易。比如用NodeJS加个拓展就行。
然而如果提供了这样的功能,就会导致卡住主线程(像
window.alert()
那样),页面中的其他js都无法运行和正常交互,极大影响用户体验。也可以用最新的async语法,能达到类似的效果,不会卡住页面主线程,目前是最好的解决方案: