我一般会这样回答:
异步请求返回的就是个 Promise ,可以用 then 获取的具体的数据。.catch 可以拿到错误。 Promise.all 可以传个数组,都返回了才会返回。 此外还有一些其它的方法。
但是每次这么说完感觉气氛都不是很对……
1
Oktfolio 2022-03-09 11:29:20 +08:00
当然是造火箭的原理
|
2
murmur 2022-03-09 11:29:24 +08:00
手搓 promise 啊,promise 的原理,那几个状态的转换,为什么会 then ,内部的状态转换,执行顺序是什么
我感觉挺扯得,明明 promise 早就是 es 标准了,现在还得学手搓 promise |
3
murmur 2022-03-09 11:30:38 +08:00
Promise.allSettled()
Promise.any() Promise.prototype.finally() Promise.race() 单论调 api 他还有这么多可以说的 |
4
fox2081 2022-03-09 11:32:53 +08:00
Promise 主要是异步啊,异步又不是只是网络请求,这有什么八股不八股的
|
5
shakukansp 2022-03-09 11:32:57 +08:00 12
难道不是应该回答 promise 是用来处理异步逻辑的,解决了 callback 嵌套读代码困难的问题,还有 promise 任务栈和 setTimeout 的任务栈优先级
你这个回答只是表层的应用,api caller |
6
Cbdy 2022-03-09 11:34:06 +08:00 via Android
Promise.resolve().then(()=>{ console.log(0); return Promise.resolve(4);}).then((r)=>{ console.log(r)})Promise.resolve().then(()=>{ console.log(1)}).then(()=>{ console.log(2)}).then(()=>{ console.log(3)}).then(()=>{ console.log(5)}).then(()=>{ console.log(6)}).then(()=>{ console.log(7)})
输出顺序是什么? |
7
caisanli 2022-03-09 11:43:45 +08:00 via iPhone
我会问 Promise 的状态是怎么改变以及实现一个人 Promise.all
|
9
murmur 2022-03-09 11:49:40 +08:00
@Cbdy 这个题谁要是能不背答案为什么 01 之后正好多出两个微任务把 23 插进去那可太牛逼了,网上都直接 spec 加 v8 底层代码实现
本来我想肛的,但是我发现 ie11 都不支持 promise ,那只能以 chrome 为准了 真正开发的时候,01234567 这么多连续执行的任务,相互关联顺序依存,还拆到两个 promise 队列执行,更牛逼 1234567 还恰好都不是异步请求,牛逼 plus 了 |
10
facecool3 2022-03-09 11:53:51 +08:00 8
我会这样子回答。不知道面试官爱听不爱听
promise 是 es6 推出的一个异步处理的通用模型, 它把一个异步任务分为 2 个阶段,未决阶段和已决阶段 未决阶段中 promise 的状态是 pending ,可以通过 resolve 或 reject 把任务 推向已决阶段,如果是 resolve ,那 promise 的状态就是 fulfiled ,如果是 reject 那 promise 的状态就是 reject , 推向已决阶段的同时,可以传递参数,用于对 promise 的后续处理。 后续处理用 then 函数,里面传 2 个回调,一个处理 resolve 一个处理了 reject 每个回调都能拿到他们状态改变时传递的对应的参数。then 函数是放到事件队列的微队列中的 then 函数也会返回一个 promise 对象,这个 promise 的状态根据后续处理函数的执行过程来决定。 如果没有对应的后续处理了,那这个 Promise 的状态与数据和上一个保持一致 如果执行中有错误,那就是 rejected 。 如果有对应的后续处理也没有错误,那这个 promise 的状态就是 fulfiled,数据就是处理函数的返回值 |
11
facecool3 2022-03-09 11:58:25 +08:00
大家来做题
const pro1 = new Promise((resolve, reject) => { reject('reject') }) pro1.then(data => { console.log(data); return '0'; }, err => { console.log(err); return 1; }).catch(err => { console.log(err); return 2; }).then(data => { console.log(data); }) |
12
twing37 2022-03-09 12:18:08 +08:00
想听到 Microtasks 和 event loop 之类的吧.
|
13
a62527776a 2022-03-09 12:33:43 +08:00 via iPhone
一般都是讲讲执行栈
|
14
majula 2022-03-09 12:46:28 +08:00 via iPhone
delimited continuation, cps, capture call stack, parent pointer tree, ...
有关的概念都说一遍呗 |
15
winglight2016 2022-03-09 12:47:57 +08:00 1
个人感觉,promise 是一种异步实现,为了解决以前的异步实现,回调函数无限嵌套的问题,实现方法是返回一个 promise 用来实现异步执行之后的顺序调用,aysnc await 是更优雅的实现方式。
思路就是:A 是什么,为什么要用 A ,解决什么问题,缺点是什么,还有什么选择是更优解。面试官不满意,很有可能是你回答反了,promise 是一种异步实现,但并不是异步请求就一定是 promise ,毕竟他关注的是你对异步编程的理解。 |
16
Track13 2022-03-09 12:50:22 +08:00 via Android
从手搓到迭代器。😂
|
17
joshua7v 2022-03-09 13:09:25 +08:00
怎么都是靠猜的呢
面试官想听什么应该是要继续往下问的啊 |
18
lscho 2022-03-09 13:17:04 +08:00 4
面试问某个技术,一般都是想知道你对这个技术出现的背景、解决了什么问题、有什么优缺点、还有什么其他选择的等。。而不是用法。
感觉 #5 #10 #15 几个老哥说的感觉都可以。 作为前端,问起 promise 马上应该意识到面试官是想问对异步的理解,毕竟异步是前端最重要的一部分了。 |
19
Cbdy 2022-03-09 13:28:01 +08:00 via Android
@murmur 这是当时别人发给我的,他说 v8 出 bug 了,然后我试了一下所有支持 promise 的浏览器表现是一致的,所以应该是规范规定的
|
20
lmshl 2022-03-09 13:38:37 +08:00
要我的话,我就回答: “Promise 是 IO Monad 的一种变体,骨子里还是 Monad 。”
本身内部状态并不重要,八股文背了无用。 我见过很多人背的很熟,真给他把键盘,还是给我写这种垃圾代码,对 flatMap(then) 完全不理解 ``` function request(...) { return new Promise(resolve => { fetch(...) .then(res => resolve(res)) }) } ``` |
21
66beta 2022-03-09 13:41:31 +08:00
手搓是为了增加短期记忆,面试的时候能条理清晰回答上来
真上班了,谁 TM 天天用到这个,忘记了就查一下呗 |
22
xuxuxu123 2022-03-09 14:11:52 +08:00
我怀疑是不是我面了你~~~
|
23
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]) 都是个人理解,错了的话打脸轻一点(捂 |
24
Leviathann 2022-03-09 14:34:30 +08:00
@lmshl 好像也有 promise 从数学上讲不是理论上的 monad 的说法。。不满足哪个律来着
|
25
Zink99 2022-03-09 15:18:24 +08:00
建议是直接按照 A+ 给他当场写一个
|
26
lmshl 2022-03-09 15:24:12 +08:00
@Leviathann 它的 then 有时候是 map 有时候是 flatMap ,数学上以及其他语言 /库里这俩是分开的,比如 Scala / Kotlin / Java8 CompeletableFuture 等等。
|
27
zhy0216 2022-03-09 15:39:25 +08:00
|
28
ChefIsAwesome 2022-03-09 15:50:51 +08:00
你可以把一个 promise 传进函数,返回一个多套了一层的 promise 。可以把多个 promise 通过 all 那些方法组合成一个新的 promise 。换句话讲,promise 是一种可以扩展组合的模块。
解决复杂问题的唯一方法是把大问题分解成小问题。就编程来讲,就是设计模块的形式和模块的组合方式。promise 就是你解决复杂异步问题的模块。 |
29
zooeymango 2022-03-09 15:59:39 +08:00
上次看面试题, 手写一个模拟 promise 的函数...其实面试官想知道的无非就是,是什么, 为什么用它, 怎么实现的, 有什么缺点和优点, 有没有更好的解决方案, 这些的, 如果遇到不知道怎么回答的就往里面套就可以了
|
30
stkstkss 2022-03-09 16:02:26 +08:00
有三种状态 进行中 已完成, 失败, 状态不可逆 ,padding 到 resole 或者 padding 到 reject, 然后深入异步,事件循环机制,跟定时器比较 宏任务 微任务
|
31
lokya 2022-03-09 16:34:29 +08:00
手撸一个 Promise 他问啥基本都差不多了
|
32
luoqiang 2022-03-09 16:42:14 +08:00
大家说的汇集起来,不行就:拿💻来,我给你现写个
|
33
Curtion 2022-03-09 17:02:08 +08:00
我觉得先从回调地狱说起,然后说 Promise 方案,最后引申到 async/await ,同时附带一些 generator 的内容,包括发布订阅都能扯进去。你的回答感觉只是在描述 API ,只表达出了会用这个东西,看起来你即不知道怎么来的,也不知道为了解决什么问题,也没有说明怎么实现的。
|
34
dany813 2022-03-09 17:26:35 +08:00
还是要对这玩意,有自己的理解,才能随心所欲的回答
|
35
Tokin 2022-03-09 17:31:46 +08:00
一般我都是这么回答的:
Promise 是异步编程的一种解决方案 支持链式调用,解决了回调地狱问题,使代码可读性更高,便于维护 有三种状态( pending 、resolve 、reject ) 状态一旦凝固无法再次更改 剩下的看面试官吧,聊聊 Event Loop 。 不过,主要还是看公司,有些公司想了解的更深入一点,但是为了不显得太啰嗦,我觉得简单聊一下就好,更深入的可以等他问 |
36
MapHacker 2022-03-09 17:47:17 +08:00
what how why?这样吗
|
37
daimubai 2022-03-09 17:58:38 +08:00
应该想听 promise 解决了什么问题,它的缺点,然后 await async 语法糖,再说下用法。
|
38
weixiangzhe 2022-03-09 19:28:54 +08:00
实现方式全敲一遍先,要问来问
|
39
rus4db 2022-03-09 19:58:03 +08:00
不就是自函子范畴上的幺半群嘛,这有什么难以理解的?
|
40
zbinlin 2022-03-09 21:16:43 +08:00
我根据 ES 规范,写了一个简单的实现,balabala 。。。
|
41
tedding 2022-03-09 21:20:05 +08:00 via iPhone
去看 mdn 的文档 再看看 你自己说的 ……
|
43
fromdark 2022-03-10 09:17:44 +08:00
面试官想听什么答案?感觉你这个问题就很跪
|