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

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

我一般会这样回答:

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


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

5990 次点击
所在节点    程序员
43 条回复
Oktfolio
2022-03-09 11:29:20 +08:00
当然是造火箭的原理
murmur
2022-03-09 11:29:24 +08:00
手搓 promise 啊,promise 的原理,那几个状态的转换,为什么会 then ,内部的状态转换,执行顺序是什么

我感觉挺扯得,明明 promise 早就是 es 标准了,现在还得学手搓 promise
murmur
2022-03-09 11:30:38 +08:00
Promise.allSettled()
Promise.any()
Promise.prototype.finally()
Promise.race()

单论调 api 他还有这么多可以说的
fox2081
2022-03-09 11:32:53 +08:00
Promise 主要是异步啊,异步又不是只是网络请求,这有什么八股不八股的
shakukansp
2022-03-09 11:32:57 +08:00
难道不是应该回答 promise 是用来处理异步逻辑的,解决了 callback 嵌套读代码困难的问题,还有 promise 任务栈和 setTimeout 的任务栈优先级
你这个回答只是表层的应用,api caller
Cbdy
2022-03-09 11:34:06 +08:00
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)})

输出顺序是什么?
caisanli
2022-03-09 11:43:45 +08:00
我会问 Promise 的状态是怎么改变以及实现一个人 Promise.all
arfaWong
2022-03-09 11:49:37 +08:00
@Cbdy #6 Uncaught SyntaxError: Unexpected identifier 😂
murmur
2022-03-09 11:49:40 +08:00
@Cbdy 这个题谁要是能不背答案为什么 01 之后正好多出两个微任务把 23 插进去那可太牛逼了,网上都直接 spec 加 v8 底层代码实现

本来我想肛的,但是我发现 ie11 都不支持 promise ,那只能以 chrome 为准了

真正开发的时候,01234567 这么多连续执行的任务,相互关联顺序依存,还拆到两个 promise 队列执行,更牛逼

1234567 还恰好都不是异步请求,牛逼 plus 了
facecool3
2022-03-09 11:53:51 +08:00
我会这样子回答。不知道面试官爱听不爱听
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,数据就是处理函数的返回值
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);
})
twing37
2022-03-09 12:18:08 +08:00
想听到 Microtasks 和 event loop 之类的吧.
a62527776a
2022-03-09 12:33:43 +08:00
一般都是讲讲执行栈
majula
2022-03-09 12:46:28 +08:00
delimited continuation, cps, capture call stack, parent pointer tree, ...

有关的概念都说一遍呗
winglight2016
2022-03-09 12:47:57 +08:00
个人感觉,promise 是一种异步实现,为了解决以前的异步实现,回调函数无限嵌套的问题,实现方法是返回一个 promise 用来实现异步执行之后的顺序调用,aysnc await 是更优雅的实现方式。

思路就是:A 是什么,为什么要用 A ,解决什么问题,缺点是什么,还有什么选择是更优解。面试官不满意,很有可能是你回答反了,promise 是一种异步实现,但并不是异步请求就一定是 promise ,毕竟他关注的是你对异步编程的理解。
Track13
2022-03-09 12:50:22 +08:00
从手搓到迭代器。😂
joshua7v
2022-03-09 13:09:25 +08:00
怎么都是靠猜的呢
面试官想听什么应该是要继续往下问的啊
lscho
2022-03-09 13:17:04 +08:00
面试问某个技术,一般都是想知道你对这个技术出现的背景、解决了什么问题、有什么优缺点、还有什么其他选择的等。。而不是用法。

感觉 #5 #10 #15 几个老哥说的感觉都可以。

作为前端,问起 promise 马上应该意识到面试官是想问对异步的理解,毕竟异步是前端最重要的一部分了。
Cbdy
2022-03-09 13:28:01 +08:00
@murmur 这是当时别人发给我的,他说 v8 出 bug 了,然后我试了一下所有支持 promise 的浏览器表现是一致的,所以应该是规范规定的
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))
})
}
```

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

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

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

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

© 2021 V2EX