常见 Promise 面试题
- 1、了解 Promise 吗?
- 2、Promise 解决的痛点是什么?
- 3、Promise 解决的痛点还有其他方法可以解决吗?如果有,请列举。
- 4、Promise 如何使用?
- 5、Promise 常用的方法有哪些?它们的作用是什么?
- 6、Promise 在事件循环中的执行过程是怎样的?
- 7、Promise 的业界实现都有哪些?
- 8、能不能手写一个 Promise 的 polyfill。
下面我们一一来解答
Promise 出现的原因------->解决回调地狱的问题
回调地狱:
请求1(function(请求结果1){
请求2(function(请求结果2){
请求3(function(请求结果3){
请求4(function(请求结果4){
请求5(function(请求结果5){
请求6(function(请求结果3){
...
})
})
})
})
})
})
回调地狱带来的负面作用有以下几点:
- 代码臃肿。
- 可读性差。
- 耦合度过高,可维护性差。
- 代码复用性差。
- 容易滋生 bug。
- 只能在回调里处理异常。
类似下面这种同步的写法。 于是 Promise 规范诞生了
let 请求结果1 = 请求1();
let 请求结果2 = 请求2(请求结果1);
let 请求结果3 = 请求3(请求结果2);
let 请求结果4 = 请求2(请求结果3);
let 请求结果5 = 请求3(请求结果4);
什么是 Promise
Promise 是异步编程的一种解决方案,比传统的异步解决方案【回调函数】和【事件】更合理、更强大。现已被 ES6 纳入进规范中。
代码书写
new Promise(请求1)
.then(请求2(请求结果1))
.then(请求3(请求结果2))
.then(请求4(请求结果3))
.then(请求5(请求结果4))
.catch(处理异常(异常信息))
API
Promise的使用总结。
Promise 这么多概念,初学者很难一下子消化掉,那么我们可以采取强制记忆法,强迫自己去记住使用过程。
-
首先初始化一个 Promise 对象,可以通过两种方式创建, 这两种方式都会返回一个 Promise 对象。
- 1、new Promise(fn)
- 2、Promise.resolve(fn)
-
然后调用上一步返回的 promise 对象的 then 方法,注册回调函数。
- then 中的回调函数可以有一个参数,也可以不带参数。如果 then 中的回调函数依赖上一步的返回结果,那么要带上参数。比如
new Promise(fn)
.then(fn1(value){
//处理value
})
复制代码
-
最后注册 catch 异常处理函数,处理前面回调中可能抛出的异常。
通常按照这三个步骤,你就能够应对绝大部分的异步处理场景。用熟之后,再去研究 Promise 各个函数更深层次的原理以及使用方式即可。
看到这里之后,我们便能回答上面的问题 4 和问题 5了。
Promsie 与事件循环
Promise在初始化时,传入的函数是同步执行的,然后注册 then 回调。注册完之后,继续往下执行同步代码,在这之前,then 中回调不会执行。同步代码块执行完毕后,才会在事件循环中检测是否有可用的 promise 回调,如果有,那么执行,如果没有,继续下一个事件循环。
Promise 的升级
ES6 出现了 async/await 语法,使异步处理更加接近同步代码写法,可读性更好,同时异常捕获和同步代码的书写趋于一致。上面的列子可以写成这样:
(async ()=>{
let 蔬菜 = await 买菜();
let 饭菜 = await 做饭(蔬菜);
let 送饭结果 = await 送饭(饭菜);
let 通知结果 = await 通知我(送饭结果);
})();
摘自:作者:lucefer
链接:https://juejin.cn/post/6844903625609707534
来源:稀土掘金
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)