面试题系列---【什么是Promise,解决什么问题?Promise.all解决了什么问题?实现原理?回调地狱?】
什么是Promise,我们用它来做什么?
1.什么是Promise
Promise 是异步编程的一种解决方案:从语法上讲,promise是一个对象,从它可以获取异步操作的消息;从本意上讲,它是承诺,承诺它过一段时间会给你一个结果。promise有三种状态: pending(等待态),fulfiled(成功态),rejected(失败态);状态一旦改变,就不会再变。创造promise实例后,它会立即执行。
2.我们用它来做什么?
promise是用来解决两个问题的:
- 回调地狱,代码难以维护, 常常第一个的函数的输出是第二个函数的输入这种现象
- promise可以支持多个并发的请求,获取并发请求中的数据
- 这个promise可以解决异步的问题,本身不能说promise是异步的
3.什么是回调地狱?
一个异步请求套着一个异步请求,一个异步请求依赖于另一个的执行结果,使用回调的方式相互嵌套。
这会导致代码很丑陋,不方便后期维护
4.Promise.all解决了什么问题?实现原理
解决了什么问题:
promise 只有成功和失败 2 个状态,让一个函数无论 成功还是失败都能被调用?
原理:
Promise.all()方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。该方法提供了并行执行异步操作的能力,并且在所有异步操作执行完并且执行结果都是成功的时候才执行回调。
const p = Promise.all([p1, p2, p3]);
-
Promise.all()方法接受一个数组作为参数,p1、p2、p3都是 Promise 实例,如果不是,就会先调用Promise.resolve方法将参数转为 Promise 实例再进一步处理。另外,Promise.all()方法的参数可以不是数组,但必须具有 Iterator 接口,且返回的每个成员都是 Promise 实例。
-
p的状态怎么决定?
2.1.只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数 组,传递给p的回调函数。
2.2.只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数
注意: 如果作为参数的 Promise 实例,自己定义了catch方法,那么它一旦被rejected,并不会触发Promise.all()的catch方法,若被rejected的 Promise 实例没有自己的catch方法,就会调用Promise.all()的catch方法。