实现一个简易版的promise,并非完全符合Promise / A+ 规范,仅供学习使用
function myPromise(fn){
const that = this;
that.state = "pending";
that.vaule = null;
that.resolveCallBacks = [];
that.rejectCallBacks = [];
function resolve(value){
if(value instanceof myPromise){
return value.then(resolve,reject);
}
setTimeout(()=>{
if(that.state == "pending"){
that.state = "resolve";
that.value = value;
that.resolveCallBacks.map(cb=>cb(that.value));
}
},0)
}
function reject(value){
if(that.state == "pending"){
that.state = "reject";
that.value = value;
that.rejectCallBacks .map(cb=>cb(that.value));
}
}
try{
fn(resolve,reject)
}catch(err){
reject(err)
}
}
myPromise.prototype.then = function(onFulfilled,onRejected){
const that = this;
onFulfilled = typeof onFulfilled == "function"?onFulfilled:v=>v;
onRejected = typeof onRejected == "function"?onRejected:v=>{throw v};
if(that.state == "pending"){
return new myPromise((resolve,reject)=>{
that.resolveCallBacks.push(()=>{
try{
let x = onFulfilled(that.value)
resolve(x)
}catch(err){
reject(err)
}
})
that.rejectCallBacks .push(()=>{
try{
let x = onRejected(that.value)
resolve(x)
}catch(err){
reject(err)
}
})
})
}
if(that.state == "resolve"){
return new myPromise((resolve,reject)=>{
try{
let x = onFulfilled(that.value)
resolve(x)
}catch(err){
reject(err)
}
})
}
if(that.state == "reject"){
return new myPromise((resolve,reject)=>{
try{
let x = onRejected(that.value)
resolve(x)
}catch(err){
reject(err)
}
})
}
}
//测试
new myPromise((resolve,reject)=>{
console.log("myPromise")
setTimeout(()=>{
console.log("myPromise resolve")
resolve(10)
},1000)
}).then(res=>{
console.log("myPromise then:",res)
return 100
}).then(res=>{
console.log("myPromise then:",res)
})
console.log("test")
下面是更简易的版本,无then
的链式调用的
function myPromise(fn){
const that = this;
that.state = "pending";
that.vaule = null;
that.resolveCallBacks = [];
that.rejectCallBacks = [];
function resolve(value){
setTimeout(()=>{
if(that.state == "pending"){
that.state = "resolve";
that.value = value;
that.resolveCallBacks.map(cb=>cb(that.value));
}
},0)
}
function reject(value){
if(that.state == "pending"){
that.state = "reject";
that.value = value;
that.rejectCallBacks .map(cb=>cb(that.value));
}
}
try{
fn(resolve,reject)
}catch(err){
reject(err)
}
}
myPromise.prototype.then = function(onFulfilled,onRejected){
const that = this;
onFulfilled = typeof onFulfilled == "function"?onFulfilled:v=>v;
onRejected = typeof onRejected == "function"?onRejected:v=>{throw v};
if(that.state == "pending"){
that.resolveCallBacks.push(onFulfilled)
that.rejectCallBacks .push(onRejected)
}
if(that.state == "resolve"){
onFulfilled(that.value)
}
if(that.state == "reject"){
onRejected(that.value)
}
}
//测试
new myPromise((resolve,reject)=>{
console.log("myPromise")
setTimeout(()=>{
console.log("myPromise resolve")
resolve(10)
},1000)
}).then(res=>{
console.log("myPromise then:",res)
})
console.log("test")