我一般会这样回答:
异步请求返回的就是个 Promise ,可以用 then 获取的具体的数据。.catch 可以拿到错误。 Promise.all 可以传个数组,都返回了才会返回。 此外还有一些其它的方法。
但是每次这么说完感觉气氛都不是很对……
|  |      1Oktfolio      2022-03-09 11:29:20 +08:00 当然是造火箭的原理 | 
|  |      2murmur      2022-03-09 11:29:24 +08:00 手搓 promise 啊,promise 的原理,那几个状态的转换,为什么会 then ,内部的状态转换,执行顺序是什么 我感觉挺扯得,明明 promise 早就是 es 标准了,现在还得学手搓 promise | 
|  |      3murmur      2022-03-09 11:30:38 +08:00 Promise.allSettled() Promise.any() Promise.prototype.finally() Promise.race() 单论调 api 他还有这么多可以说的 | 
|  |      4fox2081      2022-03-09 11:32:53 +08:00 Promise 主要是异步啊,异步又不是只是网络请求,这有什么八股不八股的 | 
|  |      5shakukansp      2022-03-09 11:32:57 +08:00  12 难道不是应该回答 promise 是用来处理异步逻辑的,解决了 callback 嵌套读代码困难的问题,还有 promise 任务栈和 setTimeout 的任务栈优先级 你这个回答只是表层的应用,api caller | 
|      6Cbdy      2022-03-09 11:34:06 +08:00 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)}) 输出顺序是什么? | 
|  |      7caisanli      2022-03-09 11:43:45 +08:00 via iPhone 我会问 Promise 的状态是怎么改变以及实现一个人 Promise.all | 
|  |      9murmur      2022-03-09 11:49:40 +08:00 @Cbdy 这个题谁要是能不背答案为什么 01 之后正好多出两个微任务把 23 插进去那可太牛逼了,网上都直接 spec 加 v8 底层代码实现 本来我想肛的,但是我发现 ie11 都不支持 promise ,那只能以 chrome 为准了 真正开发的时候,01234567 这么多连续执行的任务,相互关联顺序依存,还拆到两个 promise 队列执行,更牛逼 1234567 还恰好都不是异步请求,牛逼 plus 了 | 
|      10facecool3      2022-03-09 11:53:51 +08:00  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,数据就是处理函数的返回值 | 
|      11facecool3      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); }) | 
|  |      12twing37      2022-03-09 12:18:08 +08:00 想听到 Microtasks 和 event loop 之类的吧. | 
|  |      13a62527776a      2022-03-09 12:33:43 +08:00 via iPhone 一般都是讲讲执行栈 | 
|  |      1448y1951r9G8k7Zou      2022-03-09 12:46:28 +08:00 via iPhone delimited continuation, cps, capture call stack, parent pointer tree, ... 有关的概念都说一遍呗 | 
|  |      15winglight2016      2022-03-09 12:47:57 +08:00  1 个人感觉,promise 是一种异步实现,为了解决以前的异步实现,回调函数无限嵌套的问题,实现方法是返回一个 promise 用来实现异步执行之后的顺序调用,aysnc await 是更优雅的实现方式。 思路就是:A 是什么,为什么要用 A ,解决什么问题,缺点是什么,还有什么选择是更优解。面试官不满意,很有可能是你回答反了,promise 是一种异步实现,但并不是异步请求就一定是 promise ,毕竟他关注的是你对异步编程的理解。 | 
|  |      16bgm004      2022-03-09 12:50:22 +08:00 via Android 从手搓到迭代器。😂 | 
|  |      17joshua7v      2022-03-09 13:09:25 +08:00 怎么都是靠猜的呢 面试官想听什么应该是要继续往下问的啊 | 
|      18lscho      2022-03-09 13:17:04 +08:00  4 面试问某个技术,一般都是想知道你对这个技术出现的背景、解决了什么问题、有什么优缺点、还有什么其他选择的等。。而不是用法。 感觉 #5 #10 #15 几个老哥说的感觉都可以。 作为前端,问起 promise 马上应该意识到面试官是想问对异步的理解,毕竟异步是前端最重要的一部分了。 | 
|      19Cbdy      2022-03-09 13:28:01 +08:00 via Android @murmur 这是当时别人发给我的,他说 v8 出 bug 了,然后我试了一下所有支持 promise 的浏览器表现是一致的,所以应该是规范规定的 | 
|      20lmshl      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)) }) } ``` | 
|  |      2166beta      2022-03-09 13:41:31 +08:00 手搓是为了增加短期记忆,面试的时候能条理清晰回答上来 真上班了,谁 TM 天天用到这个,忘记了就查一下呗 | 
|  |      22xuxuxu123      2022-03-09 14:11:52 +08:00 我怀疑是不是我面了你~~~ | 
|  |      23Puteulanus      2022-03-09 14:20:39 +08:00 如果我面的话想听到的大概是这个 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]) 都是个人理解,错了的话打脸轻一点(捂 | 
|      24Leviathann      2022-03-09 14:34:30 +08:00 @lmshl 好像也有 promise 从数学上讲不是理论上的 monad 的说法。。不满足哪个律来着 | 
|  |      25Zink99      2022-03-09 15:18:24 +08:00 建议是直接按照 A+ 给他当场写一个 | 
|      26lmshl      2022-03-09 15:24:12 +08:00 @Leviathann 它的 then 有时候是 map 有时候是 flatMap ,数学上以及其他语言 /库里这俩是分开的,比如 Scala / Kotlin / Java8 CompeletableFuture 等等。 | 
|  |      27zhy0216      2022-03-09 15:39:25 +08:00 | 
|  |      28ChefIsAwesome      2022-03-09 15:50:51 +08:00 你可以把一个 promise 传进函数,返回一个多套了一层的 promise 。可以把多个 promise 通过 all 那些方法组合成一个新的 promise 。换句话讲,promise 是一种可以扩展组合的模块。 解决复杂问题的唯一方法是把大问题分解成小问题。就编程来讲,就是设计模块的形式和模块的组合方式。promise 就是你解决复杂异步问题的模块。 | 
|      29zooeymango      2022-03-09 15:59:39 +08:00 上次看面试题, 手写一个模拟 promise 的函数...其实面试官想知道的无非就是,是什么, 为什么用它, 怎么实现的, 有什么缺点和优点, 有没有更好的解决方案, 这些的, 如果遇到不知道怎么回答的就往里面套就可以了 | 
|  |      30stkstkss      2022-03-09 16:02:26 +08:00 有三种状态  进行中  已完成,  失败, 状态不可逆 ,padding 到 resole 或者 padding 到 reject,  然后深入异步,事件循环机制,跟定时器比较  宏任务  微任务 | 
|      31lokya      2022-03-09 16:34:29 +08:00 手撸一个 Promise 他问啥基本都差不多了 | 
|      32luoqiang      2022-03-09 16:42:14 +08:00 大家说的汇集起来,不行就:拿💻来,我给你现写个 | 
|  |      33Curtion      2022-03-09 17:02:08 +08:00 我觉得先从回调地狱说起,然后说 Promise 方案,最后引申到 async/await ,同时附带一些 generator 的内容,包括发布订阅都能扯进去。你的回答感觉只是在描述 API ,只表达出了会用这个东西,看起来你即不知道怎么来的,也不知道为了解决什么问题,也没有说明怎么实现的。 | 
|  |      34dany813      2022-03-09 17:26:35 +08:00 还是要对这玩意,有自己的理解,才能随心所欲的回答 | 
|  |      35Tokin      2022-03-09 17:31:46 +08:00 一般我都是这么回答的: Promise 是异步编程的一种解决方案 支持链式调用,解决了回调地狱问题,使代码可读性更高,便于维护 有三种状态( pending 、resolve 、reject ) 状态一旦凝固无法再次更改 剩下的看面试官吧,聊聊 Event Loop 。 不过,主要还是看公司,有些公司想了解的更深入一点,但是为了不显得太啰嗦,我觉得简单聊一下就好,更深入的可以等他问 | 
|  |      36MapHacker      2022-03-09 17:47:17 +08:00 what how why?这样吗 | 
|      37daimubai      2022-03-09 17:58:38 +08:00 应该想听 promise 解决了什么问题,它的缺点,然后 await async 语法糖,再说下用法。 | 
|  |      38weixiangzhe      2022-03-09 19:28:54 +08:00 实现方式全敲一遍先,要问来问 | 
|  |      39rus4db      2022-03-09 19:58:03 +08:00 不就是自函子范畴上的幺半群嘛,这有什么难以理解的? | 
|      40zbinlin      2022-03-09 21:16:43 +08:00 我根据 ES 规范,写了一个简单的实现,balabala 。。。 | 
|  |      41tedding      2022-03-09 21:20:05 +08:00 via iPhone 去看 mdn 的文档  再看看 你自己说的 …… | 
|  |      43fromdark      2022-03-10 09:17:44 +08:00 面试官想听什么答案?感觉你这个问题就很跪 |