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

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

提示: 实现起来非常简单,只要几行,不能使用任何库,要兼容浏览器环境
8740 次点击
所在节点    JavaScript
148 条回复
wefgonujnopu
21 天前
@windliang gpt 还是厉害的,我试了 grok 不行
june4
21 天前
感觉是从别的会阻塞的真线程语言刚学 js 不到 10 分钟会问出来的问题
wefgonujnopu
21 天前
@june4 你怎么知道,我刚学 js 十秒
passion336699
21 天前
之前看的一本什么书上讲过 “鸭式辨型”, 函数实现 thenable ,遵循 Promise A+,看起来像鸭子,那它就是一个鸭子
songray
21 天前
手搓 Promise 是一道常见的面试题。
https://febook.hzfe.org/awesome-interview/book1/coding-promise
Cbdy
21 天前
var Promise = require("bluebird");
felbryiozzzz
21 天前
2025 年了还在自嗨这问题 哈哈哈哈
burnsby
21 天前
会实现个这个就是大神了?这跟以前的'手撸一个 Promise'的问题有啥区别?知道这个就是大神了,那大神是多没有牌面?
wefgonujnopu
21 天前
@burnsby 所以我什么时候说知道这个就是大神了,我说的是知道这个就理解 promise 了而已
wefgonujnopu
21 天前
@felbryiozzzz 抱歉,忘记看日期了,2025 是出了什么新规定禁止讨论 promise 吗
burnsby
21 天前
@wefgonujnopu ```有没有人会写的,看看 v 站有多少大神```不是你的第一句话?掘金这种地方比较适合你,去吧
xiangyuecn
21 天前
@songray #25 面试搞的就像上古时期要求兼容 IE6 一样
wefgonujnopu
21 天前
@burnsby 是啊,大神肯定会写啊,但是会写不一定是大神,逻辑学不好的话建议去学下
mx1700
21 天前
啊???我还以为有啥高深的理解,仅仅是一个 Thenable ???稍微深入一点也应该是仅用 yield 怎么实现,再深入一点是连 yield 也用怎么实现
shuimugan
21 天前
没啥意义,qwen3-30B-A3B 的 4bit 量化在 M2 Ultra 上以 85 token/s 的速度秒了这一题,显存占用 18GB 左右。
prompt:从架构师角度分析这个问题"js 不使用 promise 完成一个 sleep 函数,必须支持 await 调用,还要能在浏览器使用",本地不跑大模型可以去官网 https://chat.qwen.ai/

当你掌握很多门语言之后,就知道那些屎一样的临时过渡方案就知道压根没必要看,JavaScript 的 async/await 都是抄 2012 年 C#发布的 5.0 语法,而且还没一次性抄对,中间搞那个 yield 恶心方案和过渡的 promise 方案,当时很流行的库有 co/bluebird/async 不知道有多少人记得。到了 2017 年 6 月 async/await 才正式并入规范,而 2017 年 5 月 Node.js 8.0 都正式支持 async/await 了,之前 6.x 都能通过参数开实验性支持了。

我从 8.0 开始用 Node.js ,当时直接上 TypeScript 写后端,根本懒得吃那些设计缺陷造的屎,原型链和这种 then 地狱风格的代码压根没写过一行,项目规范都禁止写这种代码。

至于你补充那个 python 例子,和异步也没啥关系,就一个默认递归深度,在带 GC 的语言中敢写递归之前不看限制或者有没有尾递归优化吗?
wefgonujnopu
21 天前
@mx1700 要支持 await ,肯定只能 thenable,yield 是做不到的
Imindzzz
21 天前
感觉是为了这瓶答案包了这顿题目。。。
想解决爆栈,用 setTimeout 或者尾调递归都可以的。
kneo
21 天前
深入理解茴字的第二种写法。
wefgonujnopu
21 天前
@shuimugan 是没啥关系啊,但是 js 里使用 await 之后确实不会堆栈溢出,重要的是这个,python 只是对比,正常来说都会堆栈溢出,所以 js 这点不一样
wefgonujnopu
21 天前
@Imindzzz 不是为了解决爆栈,只是研究下机制,而且 js 编译器没有实现尾递归,可以了解下

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

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

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

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

© 2021 V2EX