V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kiritoxf
V2EX  ›  程序员

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

  •  1
     
  •   kiritoxf · 157 天前 · 4585 次点击
    这是一个创建于 157 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我一般会这样回答:

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


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

    43 条回复    2022-03-10 09:17:44 +08:00
    Oktfolio
        1
    Oktfolio  
       157 天前
    当然是造火箭的原理
    murmur
        2
    murmur  
       157 天前
    手搓 promise 啊,promise 的原理,那几个状态的转换,为什么会 then ,内部的状态转换,执行顺序是什么

    我感觉挺扯得,明明 promise 早就是 es 标准了,现在还得学手搓 promise
    murmur
        3
    murmur  
       157 天前
    Promise.allSettled()
    Promise.any()
    Promise.prototype.finally()
    Promise.race()

    单论调 api 他还有这么多可以说的
    fox2081
        4
    fox2081  
       157 天前
    Promise 主要是异步啊,异步又不是只是网络请求,这有什么八股不八股的
    shakukansp
        5
    shakukansp  
       157 天前   ❤️ 12
    难道不是应该回答 promise 是用来处理异步逻辑的,解决了 callback 嵌套读代码困难的问题,还有 promise 任务栈和 setTimeout 的任务栈优先级
    你这个回答只是表层的应用,api caller
    Cbdy
        6
    Cbdy  
       157 天前 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)})

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

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

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

    1234567 还恰好都不是异步请求,牛逼 plus 了
    facecool3
        10
    facecool3  
       157 天前   ❤️ 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,数据就是处理函数的返回值
    facecool3
        11
    facecool3  
       157 天前
    大家来做题
    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
        12
    twing37  
       157 天前
    想听到 Microtasks 和 event loop 之类的吧.
    a62527776a
        13
    a62527776a  
       157 天前 via iPhone
    一般都是讲讲执行栈
    majula
        14
    majula  
       157 天前 via iPhone
    delimited continuation, cps, capture call stack, parent pointer tree, ...

    有关的概念都说一遍呗
    winglight2016
        15
    winglight2016  
       157 天前   ❤️ 1
    个人感觉,promise 是一种异步实现,为了解决以前的异步实现,回调函数无限嵌套的问题,实现方法是返回一个 promise 用来实现异步执行之后的顺序调用,aysnc await 是更优雅的实现方式。

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

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

    作为前端,问起 promise 马上应该意识到面试官是想问对异步的理解,毕竟异步是前端最重要的一部分了。
    Cbdy
        19
    Cbdy  
       157 天前 via Android
    @murmur 这是当时别人发给我的,他说 v8 出 bug 了,然后我试了一下所有支持 promise 的浏览器表现是一致的,所以应该是规范规定的
    lmshl
        20
    lmshl  
       157 天前
    要我的话,我就回答: “Promise 是 IO Monad 的一种变体,骨子里还是 Monad 。”
    本身内部状态并不重要,八股文背了无用。

    我见过很多人背的很熟,真给他把键盘,还是给我写这种垃圾代码,对 flatMap(then) 完全不理解
    ```
    function request(...) {
    return new Promise(resolve => {
    fetch(...)
    .then(res => resolve(res))
    })
    }
    ```
    66beta
        21
    66beta  
       157 天前
    手搓是为了增加短期记忆,面试的时候能条理清晰回答上来

    真上班了,谁 TM 天天用到这个,忘记了就查一下呗
    xuxuxu123
        22
    xuxuxu123  
       157 天前
    我怀疑是不是我面了你~~~
    Puteulanus
        23
    Puteulanus  
       157 天前
    如果我面的话想听到的大概是这个
    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])

    都是个人理解,错了的话打脸轻一点(捂
    Leviathann
        24
    Leviathann  
       157 天前
    @lmshl 好像也有 promise 从数学上讲不是理论上的 monad 的说法。。不满足哪个律来着
    Zink99
        25
    Zink99  
       157 天前
    建议是直接按照 A+ 给他当场写一个
    lmshl
        26
    lmshl  
       157 天前
    @Leviathann 它的 then 有时候是 map 有时候是 flatMap ,数学上以及其他语言 /库里这俩是分开的,比如 Scala / Kotlin / Java8 CompeletableFuture 等等。
    ChefIsAwesome
        28
    ChefIsAwesome  
       157 天前
    你可以把一个 promise 传进函数,返回一个多套了一层的 promise 。可以把多个 promise 通过 all 那些方法组合成一个新的 promise 。换句话讲,promise 是一种可以扩展组合的模块。
    解决复杂问题的唯一方法是把大问题分解成小问题。就编程来讲,就是设计模块的形式和模块的组合方式。promise 就是你解决复杂异步问题的模块。
    zooeymango
        29
    zooeymango  
       157 天前
    上次看面试题, 手写一个模拟 promise 的函数...其实面试官想知道的无非就是,是什么, 为什么用它, 怎么实现的, 有什么缺点和优点, 有没有更好的解决方案, 这些的, 如果遇到不知道怎么回答的就往里面套就可以了
    stkstkss
        30
    stkstkss  
       157 天前
    有三种状态 进行中 已完成, 失败, 状态不可逆 ,padding 到 resole 或者 padding 到 reject, 然后深入异步,事件循环机制,跟定时器比较 宏任务 微任务
    lokya
        31
    lokya  
       157 天前
    手撸一个 Promise 他问啥基本都差不多了
    luoqiang
        32
    luoqiang  
       157 天前
    大家说的汇集起来,不行就:拿💻来,我给你现写个
    Curtion
        33
    Curtion  
       157 天前
    我觉得先从回调地狱说起,然后说 Promise 方案,最后引申到 async/await ,同时附带一些 generator 的内容,包括发布订阅都能扯进去。你的回答感觉只是在描述 API ,只表达出了会用这个东西,看起来你即不知道怎么来的,也不知道为了解决什么问题,也没有说明怎么实现的。
    dany813
        34
    dany813  
       157 天前
    还是要对这玩意,有自己的理解,才能随心所欲的回答
    Tokin
        35
    Tokin  
       157 天前
    一般我都是这么回答的:
    Promise 是异步编程的一种解决方案
    支持链式调用,解决了回调地狱问题,使代码可读性更高,便于维护
    有三种状态( pending 、resolve 、reject )
    状态一旦凝固无法再次更改

    剩下的看面试官吧,聊聊 Event Loop 。

    不过,主要还是看公司,有些公司想了解的更深入一点,但是为了不显得太啰嗦,我觉得简单聊一下就好,更深入的可以等他问
    MapHacker
        36
    MapHacker  
       157 天前
    what how why?这样吗
    daimubai
        37
    daimubai  
       157 天前
    应该想听 promise 解决了什么问题,它的缺点,然后 await async 语法糖,再说下用法。
    weixiangzhe
        38
    weixiangzhe  
       156 天前
    实现方式全敲一遍先,要问来问
    rus4db
        39
    rus4db  
       156 天前
    不就是自函子范畴上的幺半群嘛,这有什么难以理解的?
    zbinlin
        40
    zbinlin  
       156 天前
    我根据 ES 规范,写了一个简单的实现,balabala 。。。
    tedding
        41
    tedding  
       156 天前 via iPhone
    去看 mdn 的文档 再看看 你自己说的 ……
    msg7086
        42
    msg7086  
       156 天前 via Android   ❤️ 1
    @rus4db 谢谢你大哥,治好了我能看懂中文的毛病(狗头
    fromdark
        43
    fromdark  
       156 天前
    面试官想听什么答案?感觉你这个问题就很跪
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2391 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 10:15 · PVG 18:15 · LAX 03:15 · JFK 06:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.