假如面试官要你手写一个 promise
promise
在开发中,经常需要用到 promise,promise 具有很多特性,这一次将对 promise 特性进行总结,并从零写一个 promise。
步骤一
Promise 特点
1,创建时需要传递一个函数,否则会报错
2,会给传入的函数设置两个回调函数
3,刚创建的 Promise 对象状态是 pending
步骤二
Promise 特点
4,状态一旦发生改变就不可再次改变
5,可以通过 then 来监听状态的改变
5.1,如果创建监听时,状态已经改变,立即执行监听回调
5.2,如果创建监听时,状态未改变,会等状态改变后执行
5.3,同一 promise 对象可以添加多个 then 监听,状态改变时按照注册顺序依次执行
详解 then 方法
接收两个参数:成功回调,失败回调
如果 promise 失败了,但是没有注册失败监听,就会报错
then 方法每次执行完毕都会返回一个新的 Promise 对象
如果 then 方法只有成功回调
则它返回的 promise 的状态会继承当前 promise 的状态。
如果当前 promise 的状态为成功:新 promise 的值为当前 then 的成功回调的返回值。
如果当前 promise 的状态为失败:新的 promise 没有失败监听,则会报错
如果 then 方法同时包含成功回调、失败回调
则它返回的 promise 的状态都为成功,且值为成功或者失败回调的返回值。
回调函数的返回值
如果 then 方法的成功/失败回调返回的是 promise 对象
则 then 方法返回的新的 promise 对象的状态由新 promise 的内部决定。
且值为新 promise 的内 resolve/reject 函数传递的参数。
如果 then 方法的成功/失败回调返回的是普通数据类型
则 then 方法返回的新的 promise 对象的状态都为成功。
且值为成功/失败回调的返回值,即都会传递给新的 promise 对象成功的回调。
如果 then 方法的成功/失败回调没有返回值
同返回普通数据类型
失败回调函数
可以捕获上一个 promise 对象的 then 方法中成功回调函数执行时的异常
参考 前端进阶面试题详细解答
详解 catch 方法
其实是 then 方法的失败回调函数的语法糖
如果需要同时使用 then 和 catch 方法,必须使用链式编程,不然会报错
可以捕获上一个 promise 对象的 then 方法中成功回调函数执行时的异常
为啥使用 catch 时最好使用链式编程
因为 then 方法只有成功回调,所以 p2 的状态会继承 p1
又因为 p2 的状态为失败,且没有对 p2 进行失败监听,所以报错
Promise.all()
Promise.all(params)特点
参数为一个数组,且数组元素为 promise 类型数据
返回值为一个 promise,
如果所有 promise 都执行成功
返回值为所有 promise 都成功时返回的结果的集合
如果有一个 promise 执行失败了,则返回失败的 promise
Promise.race()
Promise.race(params)特点
参数为一个数组,且数组元素为 promise 类型数据
返回值为一个 promise,且返回值为第一个成功或者失败的 promise 的值
评论