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

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

提示: 实现起来非常简单,只要几行,不能使用任何库,要兼容浏览器环境
8755 次点击
所在节点    JavaScript
148 条回复
Vegetable
21 天前
我最讨厌的就是用犄角旮旯的知识点考察面试者还沾沾自喜。尤其是这种只能考察出 知道或不知道 的谜语人问题,出现在 100 分的面试题中顶多值 2 分。
nexo
21 天前
这个当面试题 面试的人真是倒了八辈子霉 到时候面试通过 去你代码库里这样写你又要不愿意了
wefgonujnopu
21 天前
@nexo 所以手写 promise 当面试题没问题吗,手写 promise 作为面试题,代码库里面就要用手写 promise?
lianggggg
21 天前
前端是真的闲的
wefgonujnopu
21 天前
@EgoTao 递归有溢出确实是常识,但是 js 代码中 await 函数就会破坏这种常识,加了就永远不会溢出
oubenruing
21 天前
@wefgonujnopu #50 有没有一种可能, 用了 await 但没有返回 promise 时,浏览器都会创建一个 promise 。
Selenium39
21 天前
跟中国考试不准用计算器一样如出一辙
maggch97
21 天前
有一种大学生学 C 语言时候的热情。楼主没上过大学吧
wefgonujnopu
21 天前
@EgoTao
比如下面这个代码,去掉 await foo(),就会堆栈溢出,如果不去掉,程序会一直运行到出现 fatal error FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory
···
async function foo() {
return 1
}


async function main(num = 0) {
//去掉 sleep 会堆栈溢出
await foo()
await main()

}

main()


···
wefgonujnopu
21 天前
@Selenium39 面试题不都这样,比如自己实现 apply call bind 这些
Torpedo
21 天前
所以我一直都说,面试是看缘分的。
这样最好的标准就是 『你想不想和他一起工作』
icy37785
21 天前
看到 op 这种帖子,我一般都是直接 block 的。但是我还是耐着性子看了一下,op 底下的一些回复,确定看到这种帖子确实应该直接 block 。op 还臆想出了一种“高性能场景”,给我整不会了。
iMusic
21 天前
涨知识了,不过封装 sleep 函数不会比用 Promise 少多少字符
coderunI
21 天前
所以,这段代码的深层意义在于:

极简实现:它用最少的代码实现了一个可被 await 的异步延时操作。
展示了 await 的本质:它清楚地表明了 await 的机制是基于 "Thenable" 接口的,而不是死板地绑定在 Promise 类型上。这对于深入理解 JavaScript 异步编程规范( Promise A+ 规范)非常有帮助。
一种“炫技”或“教学”写法:在实际的团队项目中,为了代码的可读性和普适性,大家更倾向于使用 new Promise 的标准写法。而图片中的写法更像是一个精妙的例子,用来展示语言的内在机制。
总结
总的来说,这段代码的意义是:

在功能上,它提供了一个简洁的 sleep 函数来暂停异步代码。
在技术上,它是一个绝佳的范例,用最核心的方式展示了 await 关键字如何与任何拥有 then 方法的 "Thenable" 对象进行交互,而不仅仅是 Promise 对象。
chesha1
21 天前
本前端菜鸡根本就没看懂你的问题,new Promise setTimeout 不行吗?

稍微酷炫点的做法可以用原子量,不过一般 new Promise setTimeout 就够用了
wefgonujnopu
21 天前
@icy37785 所以你 block 之前还要回复下吗,上面已经说了,性能比原生的 promise 还慢,你确定耐着性子看了么,还是说也是自己臆想了下自己看过了,给我整不会了
nexo
21 天前
@wefgonujnopu 我没考过一道这种 除非真的是做很底层的库开发 考这些可能会有点用 用来锻炼思维
lyxxxh2
21 天前
我回答不出来,日常没用过这种。
但是各种 promise 操作,还是随便玩的。

https://ex.noerr.eu.org/t/1031867
我以前问别人的
后端我倒是会问些框架原理。
前端嘛 知道用法就行,我又不懂原理,也懒着要深入学习。
kdwnil
21 天前
高性能场景用 js ,这……对吗,自从发现 js 的时间间隔都做不到准确以后我就不在这种需求下玩弄 js 了
wefgonujnopu
21 天前
@kdwnil 对啊,你不知道 js 还有专门的 http 高并发优化的库吗,你小项目换语言容易,大项目可就要重构了,https://github.com/nodejs/undici

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

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

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

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

© 2021 V2EX