近半年面试了很多的人,其中不乏高级前端开发,而对Promise
这个现代前端异步基础掌握得实在是惨不忍睹,除了烂大街的考察事件循环中Promise
执行顺序的问题,以下这个题也是一个很好的考察点,问,以下代码输出什么?
Promise.resolve(x).then((y) => console.log(x === y))
如果你脱口而出 true
或 false
,那显然是欠考虑的。
而如果对 Promise
的发展稍有研究,其实就会发现这是考察 Promise Resolution Procedure
,根据 Promise/A+ 中的描述,x
应当分如下情况考虑:
-
若
x
为Promise
对象
1.1 若x
为Resolved
状态的Promise
,则y
为x
的value,输出false
1.2 若x
为Rejected
状态的Promise
,则不会进入上面的回调,什么也不会输出
1.3 若x
为Pendding
状态的Promise
,则等待x
状态发生变化,再走1.1
、1.2
的决议 -
若
x
是函数或对象, 取 then = x.then
2.1 若上述过程抛出异常,则不会进入y
所在的回调函数,什么也不会输出
2.2 若then
不是一个函数,则决议值为x
,输出true
2.3 若then
为函数,则调用该函数,传入resolvePromise
、rejectPromise
两个函数
2.3.1 若rejectPromise
被调用,则不会进入y
所在回调,什么也不会输出
2.3.2 若resolvePromise
被调用,则走决议流程1
2.3.3 若在then
内调用resolvePromise
之前发生异常,则不会进入y
所在回调,什么也不会输出 - 若
x
非上述其他情况,则决议为x
,即输出true
(其实还要考虑NaN的情况😄)