Promise是什么?主要用来干嘛?实现思路是什么?为什么?
1, Promise是一个类,为什么要给它定义成一个类呢?可以通过new创建,new创建都会分配新的内存,都会执行构造器
2, 为什么会有Promise,Promise用来干嘛?
js是单线程执行机制,为了避免队列阻塞,存在异步模式[请求接口,setInterval,setTimeout,…],而异步模式会存在回调情况。promise 用来处理异步代码。处理成功或者失败时回调。
什么是eventloop?
- js是单线程的,浏览器中执行 JS 代码的线程只有一个,是浏览器提供的 JS 引擎线程。当 JS 需要执行异步任务时,浏览器会另外启动一个线程去执行。eventloop是事件循环机制。用来监听调用栈和消息队列。
- 执行上下文时进入执行栈逐行执行代码[同步代码] ---- 当存在宏任务异步时,浏览器会另外开启线程去执行异步并将回调放入宏任务队列等待执行栈来取出执行。— 当存在异步微任务时,浏览器不会开启新的线程去执行,但会有回调,回调存放在微任务队列中,等待执行栈同步任务执行完成后,优于宏任务队列优先执行。【所以计时器宏任务会存在计时误差。代码不一定会在计时结束后立马执行】 ---- 执行栈执行完成后,会监听消息队列中是否有回调等待执行,有的话将消息队列中的任务依次进入执行栈执行,直到结束。循环往复。这就是事件循环eventloop。
什么是回调?回调会产生什么影响?
调用者告诉执行者异步结束后应该做什么。回调函数它是一个函数,一个异步操作结束时去执行的函数
为了避免回调嵌套/回调地狱问题,所以使用Promise来避免
。
Promise是如何来解决回调地狱问题的【什么是回调地狱问题?】?它的实现逻辑是什么?
【Promise在异步操作时使用,其实是对回调函数的封装。用来表示异步任务结束时执行成功还是失败回调。】
promise 如何实现链式调用? .then().then().then():
- 通过.then将异步的处理结果在一条链上逐层传递直到结束。
- new Promise返回的是一个promise对象,每一个promise对象都有then方法。调用.then返回的是一个promsie对象。所以通过
.then()
实现链式调用。对象调用 .then 返回的 promise 对象会作为下一个.then的参数。
promise.resolve / promise.reject: 判断状态,修改状态
- Promise.resolve():接收的参数
可以是普通值也可以是promise对象
。普通值的话将它转换为promise对象返回,promise对象的话会原封不动的返回。
const promise = new Promise(function(resolve,reject) {
resolve();//resolve,reject是两个回调函数,用来告诉执行者异步结束时是成功还是失败。两个回调函数只会执行其中一个。
reject();//resolve,reject可以理解为解析数据并暴露出去,使得在promise对象同作用域可以访问到值。
})
promise.then(): 通过状态,判断执行成功时回调还是失败时回调
- 同一个promise对象的then方法可以被多次调用
- 调用then()方法也可以不传递任何参数,也可以传递普通值作为参数。
.then()
的返回值是promise对象。 - Promise.then():
- 方法接收 2 个
可选
参数。 成功时回调 / 失败时回调。 - 执行逻辑:判断 promise 状态,通过状态决定执行成功还是失败时回调。返回promise对象,
- then方法是链式调用。
- 同一个promise对象的then方法可以被多次调用
- 方法接收 2 个
Promise静态方法干嘛的? resolve–>resolve的参数是用来将 promise 的状态更改为 fulfilled / reject
promise.all(array):
- 处理异步并发问题,允许异步代码按照调用顺序执行结果
- 返回的是promise对象
- 参数是 Array 类型,数组中可以传递 普通值 也可以是 promise 对象
- 当有多次异步操作时,只有等所有异步操作都执行完成并且全部为成功状态时,才会去调用成功时回调。或者只要有一个异步操作结果为失败状态,就会直接执行失败时回调
Promise.finally(): 不管操作结果如何一定会执行一次
无论异步操作成功还是失败,finally最终都会执行
一次,finally方法的返回值是promise对象
Promise.catch():处理失败回调
如何实现,上一次调用的.then的返回值,是下一次调用的.then的入参呢?
- resolvePromise
promise 源码理解:
- Promise是一个类。返回一个promise对象。promise 构造函数接收 2 个函数作为参数。then方法接收2个可选参数。分别是 成功 / 失败时回调。
- promise存在3种状态,
PENDING, REJECTED, FULFILLED
。状态只能由pending变成其中之一,已经改变后无法再更改 - resolve和rejected的参数的作用是改变promise的状态。
// 创建实例时,立即执行一个构造函数,给promise对象赋予状态
const PENDING = 'pending';
const FULFILLED = 'fulfilled';
const REJECTED = 'rejected';
class myPromise {
constructor( executor ) {
try {
executor(this.resolve,this.reject)
}catch(e) {
this.reject(e)
}
}
status = PENDING;
successCallback = [];//成功时回调
failCallback = [];
successdata = undefined;//成功时消息
faildata = undefined;
resolve = value => {
//使用箭头函数的目的是为了让this指向promise实例对象。
//判断状态,修改状态。
//存储成功时回调
if(this.status == PENDING) <