





























这是一个创建于 356 天前的主题,其中的信息可能已经有所发展或是发生改变。
有没有人会写的,看看 v 站有多少大神
要求:
await sleep(毫秒),让当前 async 函数进入等待,不能阻塞线程
提示: 实现起来非常简单,只要几行,不能使用任何库,要兼容浏览器环境
第 1 条附言 · 2025 年 6 月 24 日
很多人说这个没用,还嘲讽深入理解,没有解决麻烦和任何问题
我举个最简单的例子,python协程的async await,代码如下:
import asyncio
async def sleep(seconds):
await asyncio.sleep(seconds)
async def main(num=0):
# 并发执行多个异步任务
print(num)
await sleep(0.0001)
await main(num + 1)
asyncio.run(main())
输出到1000就会堆栈溢出,而用js的promise实现一样的函数,却不会
然而一旦把sleep去掉,就会立马堆栈溢出
function sleep(time){
return new Promise(resolve => setTimeout(resolve, time));
}
async function main(num=0){
console.log(num)
//去掉sleep会堆栈溢出
await sleep(1);
await main(num+1)
}
main()
因为js中的await实际上等效于then,也就是下面的代码,每次循环都是新的任务提交到事件循环队列,所以不会堆栈累加:
async function main(num=0){
console.log(num)
sleep(1).then(()=>{
main(num+1)
})
}
导致函数堆栈溢出的因素都可以说成不重要。没有任何意义,到底是自己没有认真学,还是真的不重要,各位自行判断吧
第 2 条附言 · 2025 年 6 月 24 日
不要在说有什么用,有什么应用场景了,手写apply call bind这些面试题有应用场景吗?
单纯为了兴趣研究下,就跟普通promise输出顺序的面试题一样,也可以写个类似的
async function main() {
await {
then(func) {
console.log(1)
setTimeout(func,0);
console.log(2)
}
}
console.log(3)
}
main()
``
1 Zhuzhuchenyan 2025 年 6 月 23 日 |
3 wefgonujnopu 2025 年 6 月 23 日对 promise 和 await 理解深入才能答出来。这个感觉可以当面试题,问 ai ai 都说做不到,还得提示下才回复正确答案 |
4 yimity 2025 年 6 月 23 日yield 也应该可以实现。 |
5 lscho 2025 年 6 月 23 日感觉 op 刚学 js 。。。。 之前 es6 提案通过,但是未正式实现的时候,都是这样实现的 |
7 taotaodaddy 2025 年 6 月 23 日AI 没问题的,gemini 2.5 pro 明确回答 await 关键字实际上等待的并不仅仅是 Promise 对象,而是任何符合 "Thenable" 规范的对象 它也完美得给出了与 1 楼基本相同的代码 |
8 muzig 2025 年 6 月 23 日 via Android当面试回答的意义就是“深入理解”?🤔 |
9 humbass 2025 年 6 月 23 日 via Android试了下用以下关键字问 AI (我手机上装了 7 种),只有 gemini, deepseek 回答正确。(ー_ー)!! ``` promp |
10 dcsuibian 2025 年 6 月 23 日感觉你不适合当面试官。 |
11 lscho 2025 年 6 月 24 日@Plumbiu 有没有可能我说的是 Promise 对象。。。。op 的问题本质就是 Promise ,并不是 async 和 await 。async 和 await 只是一个语法糖而已。 |
12 foolishcrab 2025 年 6 月 24 日 via iPhone拿这个面试还不如直接问对方你们公司厕所纸用的什么品牌,这必须对你们公司有强烈意向以及惊人的观察力才能回答出来。对吧? |
14 fpk5 2025 年 6 月 24 日中文提问 claude opus 4 回答不行,英文提问妙答正确答案。看来中文的训练语料库差距有点大,语言在 AI 时代仍然是个隔阂。 |
15 wefgonujnopu 2025 年 6 月 24 日@dcsuibian 面试题不就是徒增麻烦的,手写 promise 没见过吗,有什么用,async await 本质上是语法糖,await xxx 实际上执行的就是 xxx.then(()=>{}),理解这个就能写出来,某些人学 promise 可能以为是线程,在阻塞的方法前面加 await 以为能异步的人也不少 |
17 wefgonujnopu 2025 年 6 月 24 日@lscho 确实是这样实现的,不过没有 await,用起来是回调地狱,这个考验你对 await 的理解而已,不是关键词,而是语法糖 |
18 Sunzehui 2025 年 6 月 24 日什么叫“让当前 async 函数进入等待,不能阻塞线程”?你听听说的是人话吗,真不怨 AI 答不出来,难道 JavaScript 是多线程语言? |
19 wefgonujnopu 2025 年 6 月 24 日@Sunzehui 懂了,js 没有线程,什么函数都不会阻塞线程,单线程语言没有线程的概念,怎么写都不会卡死,即使是 while 死循环 |
22 june4 2025 年 6 月 24 日感觉是从别的会阻塞的真线程语言刚学 js 不到 10 分钟会问出来的问题 |
24 passion336699 2025 年 6 月 24 日之前看的一本什么书上讲过 “鸭式辨型”, 函数实现 thenable ,遵循 Promise A+,看起来像鸭子,那它就是一个鸭子 |
26 Cbdy 2025 年 6 月 24 日var Promise = require("bluebird"); |
27 felbryiozzzz 2025 年 6 月 24 日2025 年了还在自嗨这问题 哈哈哈哈 |
28 burnsby 2025 年 6 月 24 日会实现个这个就是大神了?这跟以前的'手撸一个 Promise'的问题有啥区别?知道这个就是大神了,那大神是多没有牌面? |
31 burnsby 2025 年 6 月 24 日@wefgonujnopu ```有没有人会写的,看看 v 站有多少大神```不是你的第一句话?掘金这种地方比较适合你,去吧 |
34 mx1700 2025 年 6 月 24 日 via Android啊???我还以为有啥高深的理解,仅仅是一个 Thenable ???稍微深入一点也应该是仅用 yield 怎么实现,再深入一点是连 yield 也用怎么实现 |
35 slowgen 2025 年 6 月 24 日没啥意义,qwen3-30B-A3B 的 4bit 量化在 M2 Ultra 上以 85 token/s 的速度秒了这一题,显存占用 18GB 左右。 当你掌握很多门语言之后,就知道那些屎一样的临时过渡方案就知道压根没必要看,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 的语言中敢写递归之前不看限制或者有没有尾递归优化吗? |
37 Imindzzz 2025 年 6 月 24 日感觉是为了这瓶答案包了这顿题目。。。 |
38 kneo 2025 年 6 月 24 日 via Android深入理解茴字的第二种写法。 |
39 wefgonujnopu 2025 年 6 月 24 日@shuimugan 是没啥关系啊,但是 js 里使用 await 之后确实不会堆栈溢出,重要的是这个,python 只是对比,正常来说都会堆栈溢出,所以 js 这点不一样 |
41 lichuyi 2025 年 6 月 24 日=== 问我茴香豆的茴有几种写法 |
42 visper 2025 年 6 月 24 日其实我觉得,知道 await 是在等待 Promise,是 promise 的语法糖,到这层就够开发用了。当然能手写一个 Promise 就更厉害点。至于 Thenable 这些。除了显得自己对 js 了解更多一点,其实没太多用处了。不了解也没什么。不过话说回来,招人么,同样的价钱,肯定先更厉害一点的。就像 java 那些,以前开始的时候,是大学毕业的随便问点 if else 什么的知道就行了,来了公司再学。现在呢,都想问 jvm 的了解程序啊 spring 源码啊的。 |
43 felbryiozzzz 2025 年 6 月 24 日@wefgonujnopu |
46 SanjinGG 2025 年 6 月 24 日 via Android又是这种 nc 面试题,如果 js 没有问题你问个瘠薄?你是面 js 还是面 python ? |
49 EchoWhale 2025 年 6 月 24 日 via iPhone什么场景下需要实现一个 sleep 但是不能用 promise ? |
51 Esec 2025 年 6 月 24 日 via Android当时甚至还有专门写一个延迟多少秒才返回的服务端来做计时的玩笑,只希望不要有人真拿这个当知识来记 |
53 wefgonujnopu 2025 年 6 月 24 日@SanjinGG 和 sleep 没关系,是 await 的问题,每次调用都会把 await 下方的代码创建为任务,放到任务队列中,而不是从语言底层实现异步阻塞机制 |
57 cxe2v 2025 年 6 月 24 日八股文里的任务队列跟事件循环问题被你玩出花了,当赏 |
58 wefgonujnopu 2025 年 6 月 24 日@SanjinGG 所以我什么时候说系统级了,我说的是语言底层,也就是 c++层?懂? python 的协程也是单线程,为什么可以? |
59 wefgonujnopu 2025 年 6 月 24 日@horizon 测试了下,原生的 promise 反而性能更高,v8 引擎有优化,原生 promise 为 c++对象,在 nodejs 中差别很明显,原生的快 2.5 倍左右,不过浏览器里面基本没区别,所以这个只能作为兴趣研究下 |
60 oops2day 2025 年 6 月 24 日
|
61 Vegetable 2025 年 6 月 24 日我最讨厌的就是用犄角旮旯的知识点考察面试者还沾沾自喜。尤其是这种只能考察出 知道或不知道 的谜语人问题,出现在 100 分的面试题中顶多值 2 分。 |
62 nexo 2025 年 6 月 24 日这个当面试题 面试的人真是倒了八辈子霉 到时候面试通过 去你代码库里这样写你又要不愿意了 |
63 wefgonujnopu 2025 年 6 月 24 日@nexo 所以手写 promise 当面试题没问题吗,手写 promise 作为面试题,代码库里面就要用手写 promise? |
65 wefgonujnopu 2025 年 6 月 24 日@EgoTao 递归有溢出确实是常识,但是 js 代码中 await 函数就会破坏这种常识,加了就永远不会溢出 |
67 Selenium39 2025 年 6 月 24 日跟中国考试不准用计算器一样如出一辙 |
68 penzi 2025 年 6 月 24 日有一种大学生学 C 语言时候的热情。楼主没上过大学吧 |
69 wefgonujnopu 2025 年 6 月 24 日@EgoTao async function main(num = 0) { } main() ··· |
71 Torpedo 2025 年 6 月 24 日所以我一直都说,面试是看缘分的。 |
72 icy37785 2025 年 6 月 24 日看到 op 这种帖子,我一般都是直接 block 的。但是我还是耐着性子看了一下,op 底下的一些回复,确定看到这种帖子确实应该直接 block 。op 还臆想出了一种“高性能场景”,给我整不会了。 |
73 MzM2ODkx 2025 年 6 月 24 日涨知识了,不过封装 sleep 函数不会比用 Promise 少多少字符 |
74 coderunI 2025 年 6 月 24 日所以,这段代码的深层意义在于: 极简实现:它用最少的代码实现了一个可被 await 的异步延时操作。 在功能上,它提供了一个简洁的 sleep 函数来暂停异步代码。 |
75 FlashEcho 2025 年 6 月 24 日本前端菜鸡根本就没看懂你的问题,new Promise setTimeout 不行吗? 稍微酷炫点的做法可以用原子量,不过一般 new Promise setTimeout 就够用了 |
76 wefgonujnopu 2025 年 6 月 24 日@icy37785 所以你 block 之前还要回复下吗,上面已经说了,性能比原生的 promise 还慢,你确定耐着性子看了么,还是说也是自己臆想了下自己看过了,给我整不会了 |
77 nexo 2025 年 6 月 24 日@wefgonujnopu 我没考过一道这种 除非真的是做很底层的库开发 考这些可能会有点用 用来锻炼思维 |
79 kdwnil 2025 年 6 月 24 日 via Android高性能场景用 js ,这……对吗,自从发现 js 的时间间隔都做不到准确以后我就不在这种需求下玩弄 js 了 |
82 FlashEcho 2025 年 6 月 24 日@chesha1 #75 哦我没看标题,不允许用 promise 啊,那用原子量,也很方便的 ```javascript |
83 wefgonujnopu 2025 年 6 月 24 日@chesha1 可以,新答案,虽然用了 promise 对象,但是是 api 间接调用的,我还不知道有这个方法呢,看了下是新出的 |
88 FlashEcho 2025 年 6 月 24 日@wefgonujnopu #86 不清楚啊,我也只是知道这个概念,原子量可以做 sleep 这个事,自己实际上没用过,上面这个代码是 ai 生成的,自己没试过 |
89 sss393 2025 年 6 月 24 日这是在考我知不知道鸭子类型吗? JS 里只要实现 PromiseLike 就能被 await 吧。 题外话:有时候真的很反感 js 生态圈的各种八股文写法,有没有人知道 python 和 go 的生态圈难道也这样吗。。。。 |
90 wefgonujnopu 2025 年 6 月 24 日@sss393 js 主要是历史遗留问题,刚开始是 promise 先出现,await async 还没有,后面出了,不过实现方式是语法糖,本质上还是 promise,就跟继承和 class 一样,本质都是 function,压根没有 class,类似的问题还有很多,比如 undefined 可以作为关键词,let undefined = 0 都可以,所以实际项目如果要写 undefined,规范点都会让你写 void 0 |
91 unco020511 2025 年 6 月 24 日感觉这个问题应该是个好问题,因为我这个前端初学者看不懂 |
93 oops2day 2025 年 6 月 24 日@wefgonujnopu #65 抛开 thenable 这个知识点跟你讨论哈,这个知识点你放我前几年刷八股文比较多的时候我大概率是能想到的,现在我确实没想到。 单说这个代码,就是我在业务中根本不会写出这种代码,那么它本身存在的意义并不大。如果放在 promise 规范里我觉得它也没有 promise 三个状态对于业务代码的帮助大。你下面列出来的代码,其实我在上面回复你之前自己验证过了,确实不会溢出,同样我也就比较好奇为什么不会溢出,还去 gpt 了一下。不会爆的本质就是 GC 了上一次的调用栈,所以理论上不会爆,整点闭包或者副作用多执行一会还是能爆的。 |
94 uchihaObito 2025 年 6 月 24 日async function sleep (ms) { |
95 lnbiuc 2025 年 6 月 24 日带着答案找问题,没场景创造场景 |
96 wefgonujnopu 2025 年 6 月 24 日@EgoTao 不会爆的本质是创建了微任务,而不是 GC 了,因为使用了 await,把下方的代码都包装为任务函数,添加到队列中稍后执行了,如果 GC 了,内存是不会溢出的,运行可以发现内存爆满,一瞬间几个 G ,业务中确实不会写出这种代码,因为不好维护,没意义,上面说了纯粹兴趣而已,就跟手写 apply call bind 和 promise 一样,也是面试题,但是实际项目不可能自己手写 |
98 wefgonujnopu 2025 年 6 月 24 日@lnbiuc 确实没有场景,因为是 await 原理探讨,手写 promise 也没有场景,b 站这个教程视频一堆人看呢,场景就是面试会问,除此之外没有任何场景 |
99 hengshenyu 2025 年 6 月 24 日这个问题对于老前端来说太简单了 |
100 deadpl 2025 年 6 月 24 日因为 Python 没有尾递归优化,导致栈空间溢出,跟协程没关系。 |
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。