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

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

提示: 实现起来非常简单,只要几行,不能使用任何库,要兼容浏览器环境
8786 次点击
所在节点    JavaScript
148 条回复
AoEiuV020JP
22 天前
不用看都知道帖子里的回复是“对人不对事”,明显主楼高高在上的态度惹人不快,回帖是找茬的没人想和你讨论什么,
Mandelo
22 天前
@wefgonujnopu #2 2025 了善用 AI ,
Mandelo
22 天前
@wefgonujnopu #2
function sleep(ms) {
return {
then: function (resolve) {
setTimeout(resolve, ms);
}
};
}
✅ 用法:
async function run() {
console.log('start');
await sleep(1000); // ✅ 正常延迟 1 秒
console.log('after 1 second');
}
run();
虽然没有写 new Promise(...),但依然是一个“类 Promise 对象”,这是唯一能让 await 起作用的方法。
hzzhzzdogee
22 天前
@Torpedo true
wefgonujnopu
22 天前
@AoEiuV020JP 这样帖子才能火,这叫逆向思维,不然就是无人问津了
unused
22 天前
await 会为 Thenable 创建 Promise
ykrank
22 天前
@wefgonujnopu #47 imgur 都打不开的开发者...符合会问这种问题的刻板印象
taotaodaddy
22 天前
讨论的还挺热烈,不管怎么样,gemini 4o qwen 都可以,grok 不行,老马得加把劲了
wefgonujnopu
22 天前
@ykrank 懂了."data":{"error":"Imgur is temporarily over capacity. Please try again later."},"success":false,"status":403} 所以 imgur 过载是我的问题
Plumbiu
22 天前
跟楼主说一下,楼主的例子其实现实中也有类似的,例如轮询,对象的毕设用的 lvgl ,里面的回调事件就是 30ms 轮询监听的,另外我之前也写过监听窗口句柄变化的时尚小垃圾,也是过 1s 左右轮询一次。楼上觉得没实际意义大概率是见识太少了
jiangzm
22 天前
这个考查不了什么, 知道不加分不知道不减分
jiangzm
22 天前
楼主刚知道的一个基础知识点,准备用来做面试题, 笑死人,哈哈哈哈😂😂😂
siweipancc
22 天前
震惊我后端仔了
maolon
22 天前
hmmm 这种茴香豆的茴几种写法的东西除了考八股真有人会写到业务代码里去?
flyn
22 天前
虽然好多人在嘲讽楼主,但我还真是的涨见识了,因为我是业余的,和上面某个楼的前端新手的知识储备类似
mightybruce
22 天前
js 尾调用优化了解了解, 把递归变成循环。
await 就是按照顺序执行,它就是阻塞, 我都没看到有人提到

python 中是 async.gather

js 中是 promise.all 来做

如果不用 promise 还得研究一下。
wefgonujnopu
21 天前
@mightybruce 我服了,js 没有尾调用优化好吗,你自己试试,不在末尾的 await,也不会触发堆栈溢出的
wefgonujnopu
21 天前
@maolon 本来就是考八股的,什么时候说写业务了
accelerator1
21 天前
LZ 既然摆出了考验别人的姿态,那就要做好被别人质疑的准备,事情都有好坏方面。

题目要求是 await sleep ,大部分想到的都是 thenable 对象了,楼上已经有人写出来了。

原因 LZ 自己也说了,python 那个不行就是因为它的 await 不像 js 会清除调用栈变为事件循环。

其实用阻塞 sleep 也行,只要有 async/await 关键字,就能清除调用栈保证不会栈溢出。

```
function sleep(ms) {
const start = Date.now();
while (Date.now() - start < ms) {
// 阻塞
}
}

async function main(num=0){
console.log(num)
//去掉 await 会堆栈溢出
await sleep(1);
await main(num+1)
}

main()
```
wefgonujnopu
21 天前
@accelerator1 是,但是题目已经说了,不能用阻塞 sleep

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

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

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

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

© 2021 V2EX