Promise是拿来解决回调函数的,用法很简单,弄清楚原理很重要,现在我们来手写一下Promise
Promise对象有三种状态值pending resolved rejected
Promise使用
new Promise((resolve,reject)=>{
resolve(‘demo’)
}).then(
value=>{
console.log(value)
},
err=>{
console.log(err)
}
)
可以看到promise中传了一个函数作为参数,而这个函数又有两个函数作为参数传入其中
Promsise中还有三个状态
resolve 和 reject中各有参数 参事是Promise返回的结果
现在我们可以开始写了

myPromise(executor){
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    var _self = this;//先把当前this取出来
_self.value = undefined;//这是Promise成功返回的值
_self.reason = undefined;//这是Promise执行错误返回的错误信息
_self.state = 'pending'//这是Promise的初始状态
let resolve = function (value){
if(_self.state === 'pending'){
_self.state = 'resolved'//这是执行resolve函数后Promise状态改变为resolved
_self.value = value //保存Promise成功返回的值
}
}
let reject = function (reason){
if(_self.state === 'pending'){
_self.state = 'rejected'//这是执行resolve函数后Promise状态改变为resolved
_self.value = reason //保存Promise失败返回的值
}
}
executor(resolve,reject)
}

测试一下


测试成功,接下来我们要实现他的核心部分then函数的回调
可以发现then中也是传递了两个函数参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 myPromise.prototype.then = function (success,failure){
var _self = this;
let myPromise1 = new myPromise(function(resolve,reject){
if(_self.state === 'resolved'){
let s = success(_self.value);//如果成功把promise成功返回的值赋给s
resolve(s)//继续调用resolve
}
if(_self.state === 'rejected'){
let f = failure(_self.reason);//如果成功把promise失败返回的原因赋给f
reject(f)
}
})
return myPromise1//然后返回得到的Promise
}

到这Promise基本功能都实现了
测试一下