一个题考察对Promise的掌握情况

近半年面试了很多的人,其中不乏高级前端开发,而对Promise这个现代前端异步基础掌握得实在是惨不忍睹,除了烂大街的考察事件循环中Promise执行顺序的问题,以下这个题也是一个很好的考察点,问,以下代码输出什么?

Promise.resolve(x).then((y) => console.log(x === y))

如果你脱口而出truefalse,那显然是欠考虑的。

而如果对Promise的发展稍有研究,其实就会发现这是考察Promise Resolution Procedure,根据Promise/A+中的描述,x应当分如下情况考虑:

  1. xPromise对象
    1.1 若xResolved状态的Promise,则yx的value,输出false
    1.2 若xRejected状态的Promise,则不会进入上面的回调,什么也不会输出
    1.3 若xPendding状态的Promise,则等待x状态发生变化,再走1.11.2的决议

  2. x是函数或对象, 取 then = x.then
    2.1 若上述过程抛出异常,则不会进入y所在的回调函数,什么也不会输出
    2.2 若then 不是一个函数,则决议值为x,则输出true
    2.3 若then为函数,则调用该函数,传入resolvePromiserejectPromise两个函数
    2.3.1 若rejectPromise被调用,则不会进入y所在回调,什么也不会输出
    2.3.2 若resolvePromise被调用,则走决议流程1
    2.3.3 若在then内调用resolvePromise之前发生异常,则不会进入y所在回调,什么也不会输出

  3. x非上述其他情况,则决议为x,即输出true(其实还要考虑NaN的情况😄)

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据