近半年面试了很多的人,其中不乏高级前端开发,而对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的情况😄)