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

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

提示: 实现起来非常简单,只要几行,不能使用任何库,要兼容浏览器环境
8775 次点击
所在节点    JavaScript
148 条回复
xz410236056
22 天前
@wefgonujnopu #15 你这言论让我想起前几天看的一篇文章,用 C 语言搞一堆优化魔法为什么没 RUST 快,因为 C 语言没有跟进 CPU 的分支预测、simd 等特性。意思是,你搞这玩意(在很多人看来)毫无意义,真喜欢研究就去给 ECMAScript 提交标准呀(你所谓的那些实际执行什么的,完全不如一个新的研究、新的指令、编译器优化带来的提升大)。
wefgonujnopu
22 天前
@deadpl 是没关系,python 只是为了对比,正常语言都是这样的,但是 js 的就和 await 有关系,所以 js 不正常
wefgonujnopu
22 天前
@xz410236056 很多人看来无意义就是无意义吗,我觉得有意义,而且手写 promise 比这个难多了,面试也会问 js 的宏任务微任务执行过程,是很常见的问题
lizhenda
22 天前
笑死,这问题我在面试时还真问过,其实大多数中高级前端都基本能回答出来,一下没反应过来引导下也是可以,只是考查对 promise 实现的理解以及 js 事件循环有没有概念 await/async 本质是啥,编译后的产物有没有看过之类的。
kongcc
22 天前
我不会写 但是我月薪 xxxx
lizhenda
22 天前
@lizhenda 还记得好多年前会问下在 es6 没出来前,用 js 自己怎么实现一个 class 的思路。最近这些年就只问 vue/react 之类的理解和实践了。
wefgonujnopu
22 天前
@lizhenda 这么巧,还真有人问过,这个确实不难,只要理解透彻 promise 的都能回答出来,不过貌似 v2 很多人不会,一堆人嘲讽
xz410236056
22 天前
@wefgonujnopu #103
1 、是的,当然你觉得好玩那就是有意义。
2 、面试不是考试(国内喜欢把面试当考试纯属面试官菜),你筛选出知道这些人的目的是什么呢?
wefgonujnopu
22 天前
@xz410236056 没什么目的啊,v2 不就是程序员交流的吗,而且也没筛选出来知道的人啊,就一个人回答正确了,其他的也就没回复了,正常交流技术而已
mizuki9
22 天前
确实没啥用,thenable 和 理解透彻 promise 有关系吗,知道 thenable 就透彻了?透彻在哪?
作为考察前端知识的了解程度是可以的。
wefgonujnopu
22 天前
@mizuki9 我说的是,理解透彻了,肯定知道 thenable 啊,你不知道 thenable 能算理解透彻? 但是知道 thenable 不代表理解透彻
wangtian2020
22 天前
点开帖子,浏览问题,思考一会,发现不会
勃然大怒,全文搜索,没人骂 op ,失望离开


—— 像 promise.then 那样,await 允许我们使用 thenable 对象(那些具有可调用的 then 方法的对象)。这里的想法是,第三方对象可能不是一个 promise ,但却是 promise 兼容的:如果这些对象支持 .then ,那么就可以对它们使用 await
https://zh.javascript.info/async-await
johnnyyeen
22 天前
大哥,递归一般是禁止在生产环境使用的,我记得我刚去腾讯那会,解决了一个前任的诡异 bug ,就是因为递归调用导致栈溢出。
这是最基本的常识.......
wefgonujnopu
22 天前
@johnnyyeen 说的是对 promise 的理解,递归是次要的,而且不同公司规定不一样,怎么可能全部禁用递归,递归也确实有优点,比如可读性高,代码简洁
johnnyyeen
22 天前
@wefgonujnopu 除了教学基本没优点,就如此简单。
johnnyyeen
22 天前
生产环境用递归的,见一个砍一个。
wefgonujnopu
22 天前
@johnnyyeen 就是教学用的,跟手写 promise 一样,上面已经说了
bowencool
22 天前
@Zhuzhuchenyan #1 涨姿势了
enpitsulin
22 天前
就算用 Promise/PormiseLike/Thenable 就本质一个 callback 的 语法糖,做不到不阻塞线程也配叫 sleep ?没睡醒?

[Atomics.wait]( https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Atomics#%E7%AD%89%E5%BE%85%E5%92%8C%E9%80%9A%E7%9F%A5_2)
wefgonujnopu
22 天前
@enpitsulin 你说的啥,promise 本身就是不阻塞线程的

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

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

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

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

© 2021 V2EX