Skip to content

Instantly share code, notes, and snippets.

@huruji
Created July 13, 2018 17:51
Show Gist options
  • Save huruji/80083a88471834c512db584c322054d1 to your computer and use it in GitHub Desktop.
Save huruji/80083a88471834c512db584c322054d1 to your computer and use it in GitHub Desktop.
a deom for Promise
function Promise(excutor) {
let self = this;
self.status = 'pending';
self.value = null;
self.reason = null;
self.onFulfilledCallbacks = [];
self.onRejectedCallbacks = [];
function resolve(value) {
if(self.status === 'pending') {
self.value = value;
self.status = 'fulfilled';
self.onFulfilledCallbacks.forEach(item => item(self.value))
}
}
function reject(reason) {
if(self.status === 'pending') {
self.reason = reason;
self.status = 'rejected';
self.onRejectedCallbacks.forEach(item => item(self.reason));
}
}
try{
excutor(resolve, reject);
} catch(err) {
reject(err);
}
}
Promise.prototype.then = function(onFulfilled, onRejected) {
onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : function(data){return data};
onRejected = typeof onRejected === 'function' ? onRejected : function(err){throw err}
let self = this;
if(self.status === 'fulfilled'){
return new Promise((resolve, reject) => {
try {
let x = onFulfilled(self.value);
if(x instanceof Promise) {
x.then(resolve, reject)
} else {
resolve(x)
}
} catch(err){
reject(err);
}
})
}
if(self.status === 'rejected') {
return new Promise((resolve, reject) => {
try{
let x = onRejected(self.reason);
if( x instanceof Promise) {
x.then(resolve, reject)
} else {
resolve(x)
}
} catch(err){
reject(err)
}
})
}
if(self.status === 'pending') {
return new Promise((resolve, reject) => {
self.onFulfilledCallbacks.push(() => {
let x = onFulfilled(self.value);
if(x instanceof Promise) {
x.then(resolve, reject)
} else {
resolve(x)
}
})
self.onRejectedCallbacks.push(() => {
let x = onRejected(self.reason);
if(x instanceof Promise) {
x.then(resolve, reject);
} else {
resolve(x)
}
})
})
}
}
Promise.prototype.catch = function(fn) {
return this.then(null, fn);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment