前言
关于什么是Promise以及用法这里就不多说了,图片看上去一目了然,图片引用自MDN。
有一次面试,被要求手写代码实现一个简单的Promise,虽然经常用,但是当时只能就着Promise/A+规范扯两句代码,就是没写出来,于是就试着写一下
分析
1、Promise有3种状态
- pending: 初始状态,pending可以转化为fulfilled或者rejected状态,并且只能有一次转化,并且不可逆
- fulfilled: 成功状态
- rejected: 失败状态
2、初始化Promise接收一个函数为参数,该函数有两个函数作为参数,分别是resolve和reject
- resolve将pending转化为fulfilled,在成功时调用,并将成功结果作为参数传递
- reject将pending转化为rejected,在失败时调用,并将失败结果当参数传递
1
2
3
4
5
6
7
8var promise = new Promise (function (resolve,reject) {
if (<!--成功的条件-->){
resolve(value)
}
else {
reject(error)
}
})
3、方法then和catch
- then注册状态转化的回调函数,接收onFulfilled或者onRejected,并返回一个新的Promise,保证链式调用
- catch相当于 return this.then(null, onRejected),Promise对象的错误具有冒泡性质,错误会不断的向后传递,直到 .catch() 捕获
- 如果then和catch接收的不是函数,就会发生穿透
实现
代码抄袭
深入理解 Promise (中)
剖析Promise内部结构,一步一步实现一个完整的、能通过所有Test case的Promise类
深入 Promise(一)——Promise 实现详解
上代码
1 | ;(function () { |
测试
1 | var http = require('request'); |