promise使用:
let promise= new Promise(function(resolve, reject) {
if (...) {
resolve()
} else {
reject()
}
})
promise.then(res => {}, err => {})
分析:
根据模板来分析:
1. 构造函数Promise传入的参数是一个函数,因此在构造函数中需要执行这个函数,传入的函数有两个参数,分别是resolve()函数和reject()函数,因此Promise内部要有这两个函数;
2. promise的状态一开始是pending状态,成功之后变为resolved状态,失败之后变为rejected状态,因此在构造函数内部先定义一个status,初始值为pending,当执行resolve函数时设置为resolved,当执行reject函数时设置为rejected;
3. resolve 返回成功值, reject 返回失败值,因此构造函数内部需定义两个变量value 和 reason;
4. then方法传入两个参数,分别为成功执行函数和失败执行函数,Promise的原型上添加then方法,在resolved状态下执行成功执行函数,传入value,在rejected状态下执行失败执行函数,传入reason;
实现:
// 构造函数
function Promise(executor) {
var self = this;
// promise状态
self.status = 'pending';
// 成功返回值
self.value;
// 失败返回值
self.reason;
function resolve(value) {
if(self.status === 'pending'){
self.status = 'resolved';
self.value = value;
}
},
function reject(reason) {
if(self.status === 'pending'){
self.status = 'rejected';
self.reason = reason
}
}
executor(resolve,reject)
}
// then方法
Promise.prototype.then = function(onFulfilled,onRejected){
var self = this;
if (self.status === 'resolved'){
onFulfilled(self.value)
}
if (self.status === 'rejected'){
onRejected(self.reason)
}
}
// catch 方法举一反三