在前端面试八股中,问到 Promise 时面试官是想听到什么样的答案?

2022-03-09 11:26:01 +08:00
 kiritoxf

我一般会这样回答:

异步请求返回的就是个 Promise ,可以用 then 获取的具体的数据。.catch 可以拿到错误。 Promise.all 可以传个数组,都返回了才会返回。 此外还有一些其它的方法。


但是每次这么说完感觉气氛都不是很对……

5748 次点击
所在节点    程序员
43 条回复
66beta
2022-03-09 13:41:31 +08:00
手搓是为了增加短期记忆,面试的时候能条理清晰回答上来

真上班了,谁 TM 天天用到这个,忘记了就查一下呗
xuxuxu123
2022-03-09 14:11:52 +08:00
我怀疑是不是我面了你~~~
Puteulanus
2022-03-09 14:20:39 +08:00
如果我面的话想听到的大概是这个
promise 代表一段异步过程,它实现了异步过程的标准化,是 async/await 语法可以统一处理异步过程的基石

回调地狱的主要原因是,多段需要按顺序执行的异步过程,前一段必需持有后一段的指针,和链表很像

promise 就像宜家的可堆叠收纳箱,对里面,用 resolve 指代下一段异步过程,对外面,把各不相同的异步过程包装成统一标准,使用统一的 IO ,从而使用 then 调用链把回调地狱的链表(A->B->C)变成了数组(A.append(B).append(C)),最终在 async/await 语法糖中得以变成 A await B await C ([A, B, C])

都是个人理解,错了的话打脸轻一点(捂
Leviathann
2022-03-09 14:34:30 +08:00
@lmshl 好像也有 promise 从数学上讲不是理论上的 monad 的说法。。不满足哪个律来着
Zink99
2022-03-09 15:18:24 +08:00
建议是直接按照 A+ 给他当场写一个
lmshl
2022-03-09 15:24:12 +08:00
@Leviathann 它的 then 有时候是 map 有时候是 flatMap ,数学上以及其他语言 /库里这俩是分开的,比如 Scala / Kotlin / Java8 CompeletableFuture 等等。
zhy0216
2022-03-09 15:39:25 +08:00
ChefIsAwesome
2022-03-09 15:50:51 +08:00
你可以把一个 promise 传进函数,返回一个多套了一层的 promise 。可以把多个 promise 通过 all 那些方法组合成一个新的 promise 。换句话讲,promise 是一种可以扩展组合的模块。
解决复杂问题的唯一方法是把大问题分解成小问题。就编程来讲,就是设计模块的形式和模块的组合方式。promise 就是你解决复杂异步问题的模块。
zooeymango
2022-03-09 15:59:39 +08:00
上次看面试题, 手写一个模拟 promise 的函数...其实面试官想知道的无非就是,是什么, 为什么用它, 怎么实现的, 有什么缺点和优点, 有没有更好的解决方案, 这些的, 如果遇到不知道怎么回答的就往里面套就可以了
stkstkss
2022-03-09 16:02:26 +08:00
有三种状态 进行中 已完成, 失败, 状态不可逆 ,padding 到 resole 或者 padding 到 reject, 然后深入异步,事件循环机制,跟定时器比较 宏任务 微任务
lokya
2022-03-09 16:34:29 +08:00
手撸一个 Promise 他问啥基本都差不多了
luoqiang
2022-03-09 16:42:14 +08:00
大家说的汇集起来,不行就:拿💻来,我给你现写个
Curtion
2022-03-09 17:02:08 +08:00
我觉得先从回调地狱说起,然后说 Promise 方案,最后引申到 async/await ,同时附带一些 generator 的内容,包括发布订阅都能扯进去。你的回答感觉只是在描述 API ,只表达出了会用这个东西,看起来你即不知道怎么来的,也不知道为了解决什么问题,也没有说明怎么实现的。
dany813
2022-03-09 17:26:35 +08:00
还是要对这玩意,有自己的理解,才能随心所欲的回答
Tokin
2022-03-09 17:31:46 +08:00
一般我都是这么回答的:
Promise 是异步编程的一种解决方案
支持链式调用,解决了回调地狱问题,使代码可读性更高,便于维护
有三种状态( pending 、resolve 、reject )
状态一旦凝固无法再次更改

剩下的看面试官吧,聊聊 Event Loop 。

不过,主要还是看公司,有些公司想了解的更深入一点,但是为了不显得太啰嗦,我觉得简单聊一下就好,更深入的可以等他问
MapHacker
2022-03-09 17:47:17 +08:00
what how why?这样吗
daimubai
2022-03-09 17:58:38 +08:00
应该想听 promise 解决了什么问题,它的缺点,然后 await async 语法糖,再说下用法。
weixiangzhe
2022-03-09 19:28:54 +08:00
实现方式全敲一遍先,要问来问
rus4db
2022-03-09 19:58:03 +08:00
不就是自函子范畴上的幺半群嘛,这有什么难以理解的?
zbinlin
2022-03-09 21:16:43 +08:00
我根据 ES 规范,写了一个简单的实现,balabala 。。。

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

https://www.v2ex.com/t/839079

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

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

© 2021 V2EX