js 不使用 promise 完成一个 sleep 函数,必须支持 await 调用

22 天前
 wefgonujnopu
有没有人会写的,看看 v 站有多少大神
要求:
await sleep(毫秒),让当前 async 函数进入等待,不能阻塞线程

提示: 实现起来非常简单,只要几行,不能使用任何库,要兼容浏览器环境
8747 次点击
所在节点    JavaScript
148 条回复
lichuyi
21 天前
=== 问我茴香豆的茴有几种写法
visper
21 天前
其实我觉得,知道 await 是在等待 Promise,是 promise 的语法糖,到这层就够开发用了。当然能手写一个 Promise 就更厉害点。至于 Thenable 这些。除了显得自己对 js 了解更多一点,其实没太多用处了。不了解也没什么。不过话说回来,招人么,同样的价钱,肯定先更厉害一点的。就像 java 那些,以前开始的时候,是大学毕业的随便问点 if else 什么的知道就行了,来了公司再学。现在呢,都想问 jvm 的了解程序啊 spring 源码啊的。
felbryiozzzz
21 天前
@wefgonujnopu
你如果是个技术向,你大可以去多研究算法/设计模式/编译这些更高级的领域,去做一些解决方案出来解决实际问题。不管是公司级别的还是前端通用的领域
新语法出来是解决开发效率的,promise 给你了,async 给你了,规范制定者想,两者相结合异步的问题总该是都能解决了吧?好家伙,总有些大聪明想着我再用旧语法给你实现一遍,搞得我多理解这个语言语法一样。要是自己研究过了挺有成就感,还拿去面试别人,那只能说是真高人了
burnsby
21 天前
@wefgonujnopu 我要笑死了,你问题里的不是`看看 v 站有多少大神会写的`,还搁这逻辑学呢。

来,再给你贴个 AI 的回答。[img]( https://imgur.com/RNXDUyj)
wefgonujnopu
21 天前
@felbryiozzzz 抱歉,这就是新语法,await 没有旧语法,这只是另一种实现方式,旧的是 settimeout 回调
SanjinGG
21 天前
又是这种 nc 面试题,如果 js 没有问题你问个瘠薄?你是面 js 还是面 python ?
wefgonujnopu
21 天前
@burnsby 我问的是,有没有人会写的,看看 v 站有多少大神,我有说会写=大神?你发的图都点不开,真的笑死了
wefgonujnopu
21 天前
@SanjinGG 就是 js 有问题,python 反而没问题,正常来讲都应该堆栈溢出,麻烦仔细看下
EchoWhale
21 天前
什么场景下需要实现一个 sleep 但是不能用 promise ?
wefgonujnopu
21 天前
@EchoWhale 高性能场景,只需要返回一个 thenable 对象,promise 对象需要维护的状态更多,占用的空间更多
Esec
21 天前
当时甚至还有专门写一个延迟多少秒才返回的服务端来做计时的玩笑,只希望不要有人真拿这个当知识来记
SanjinGG
21 天前
@wefgonujnopu ? js 到底用不用 sleep ?如果用 sleep 有什么问题?
wefgonujnopu
21 天前
@SanjinGG 和 sleep 没关系,是 await 的问题,每次调用都会把 await 下方的代码创建为任务,放到任务队列中,而不是从语言底层实现异步阻塞机制
realJamespond
21 天前
之前很多库的 promise 不是原生的
horizon
21 天前
@wefgonujnopu #48
是你臆想的高性能场景,还是实际使用这种方法提升了性能?
SanjinGG
21 天前
@wefgonujnopu js 单线程底层就是不支持系统级的 sleep ,你好像有点杠啊?
cxe2v
21 天前
八股文里的任务队列跟事件循环问题被你玩出花了,当赏
wefgonujnopu
21 天前
@SanjinGG 所以我什么时候说系统级了,我说的是语言底层,也就是 c++层?懂? python 的协程也是单线程,为什么可以?
wefgonujnopu
21 天前
@horizon 测试了下,原生的 promise 反而性能更高,v8 引擎有优化,原生 promise 为 c++对象,在 nodejs 中差别很明显,原生的快 2.5 倍左右,不过浏览器里面基本没区别,所以这个只能作为兴趣研究下
EgoTao
21 天前
好了,我承认是菜逼,要是面试遇到这题我指定不会,看了半天甚至没看懂题目要解决的问题。有没有屌大的给解释一下目的是啥。实际业务场景中会实现 op 举例的这种代码么,简化一下 Op 的代码本质上是递归,其实和异步或者说 promise 并没有关系。实现递归必须保证有结束分支不然就会死循环栈溢出这个应该是常识。 如果有实际业务应用的代码,请指教。 当然,如果说像楼上说的为了 thenable 这盘醋包的这个饺子,那确实值得大家这么嘲讽。 我很久没看了,以前刷八股文的时候我记得 thenable 是 promise 的规范还是啥的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1140531

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX