function mypromise(func){
this.statue = "pending";
this.data = null;
this.resolveCallback = [];
this.rejectCallback = [];
this._final = null;
var self = this;
var resolve = function(data){
if (data instanceof mypromise) {
data.then(resolve,reject)
return;
}
setTimeout(function(){
if(self.statue != "pending") return;
self.data = data;
self.statue = "resolve";
for(var i = 0; i < self.resolveCallback.length; i++){
var item = self.resolveCallback[i];
item.bind(self)(data)
}
},0)
}
var reject = function(data){
setTimeout(function(){
if(self.statue != "pending") return;
self.data = data;
self.statue = "reject";
for(var i = 0; i < self.rejectCallback.length; i++){
var item = self.rejectCallback[i];
item.bind(self)(data)
}
},0)
}
try {
if (typeof func == 'function'){
func.bind(this)(resolve,reject);
}else{
if(func == 'reject'){
this.statue = "reject";
reject();
}else{
this.statue = "resolve";
resolve();
}
}
} catch (e) {
reject(e)
}
}
mypromise.prototype.then = function(onresolve,onreject){
var self = this;
onresolve = typeof onresolve === 'function' ? onresolve : function(data){return data;}
onreject = typeof onreject === 'function' ? onreject : function(data){return data;}
if(self.statue == "pending"){
return new mypromise(function(resolve,reject){
var _this = this;
self.resolveCallback.push(function(data){
var x = onresolve(data);
if(x instanceof mypromise){
x.then(resolve,reject)
}else{
resolve(x)
}
typeof _this._final == 'function' ? _this._final() : null;
})
self.rejectCallback.push(function(data){
var x = onreject(data);
if(x instanceof mypromise){
x.then(resolve,reject)
}else{
reject(x)
}
typeof _this._final == 'function' ? _this._final() : null;
})
});
}
if(self.statue == "resolve"){
return new mypromise(function(resolve,reject){
var x = onresolve(self.data);
if(x instanceof mypromise){
x.then(resolve,reject)
}else {
resolve(x);
}
typeof this._final == 'function' ? this._final() : null;
});
}
if(self.statue == "reject"){
return new mypromise(function(resolve,reject){
var x = onreject(self.data);
if(x instanceof mypromise){
x.then(resolve,reject)
}else {
reject(x);
}
typeof this._final == 'function' ? this._final() : null;
});
}
}
mypromise.prototype.catch = function(reject){
return this.then(null,reject);
}
mypromise.All = function(){
var allArguments = arguments;
var len = allArguments.length,
item = null,
successResult = [],
failResult = []
resultData = [];
return new mypromise(function(resolve,reject){
function resolver(index){
return function(data){
successResult.push(1);
resolveAll(index,data);
}
}
function rejecter(index){
return function(data){
failResult.push(1);
resolveAll(index,data);
}
}
function resolveAll(index,data){
resultData.push({index:index,data:data})
if(successResult.length + failResult.length == len){
if( successResult.length == len){
resolve(resultData)
}else{
reject(data)
}
}
}
for(var i = 0; i < len; i++){
item = allArguments[i];
if(!(item instanceof mypromise)){
throw new TypeError("you must pass promise to mypromise.all")
}
item.then(resolver(i),rejecter(i))
}
})
}
mypromise.Race = function(){
var allArguments = arguments;
var len = allArguments.length,
item = null,
successResult = [],
failResult = [];
return new mypromise(function(resolve,reject){
function resolver(data){
successResult.push(1);
resolveAll(data);
}
function rejecter(data){
failResult.push(1);
reject(data);
}
function resolveAll(data){
resolve(data)
}
for(var i = 0; i < len; i++){
item = allArguments[i];
if(!(item instanceof mypromise)){
throw new TypeError("you must pass promise to mypromise.all")
}
item.then(resolver,rejecter)
}
})
}
mypromise.Resolve = function(func){
if(func instanceof mypromise){
return func;
}else{
return new mypromise('resolve');
}
}
mypromise.Reject = function(func){
return new mypromise('reject');
}
mypromise.prototype.Final = function(onresolve){
this._final = onresolve;
}