fmd.js
Version:
another module writing system
91 lines (65 loc) • 1.98 kB
JavaScript
/**
* @module fmd/when
* @author Edgar <mail@edgar.im>
* @version v0.1
* @date 130419
* */
fmd( 'when', function(){
'use strict';
/**
* Thanks to:
* cujo.js, https://github.com/cujojs/curl/blob/master/src/curl.js
* jQuery, https://github.com/jquery/jquery/blob/1.7.2/src/deferred.js
* */
var noop = function(){};
var Promise = function( len ){
var _this = this,
thens = [],
resolved = 0,
rejected = 0;
len = len || 0;
var probe = function(){
if ( resolved + rejected === len ){
complete();
}
},
complete = function(){
_this.then = !rejected ?
function( resolved, rejected ){ resolved && resolved(); } :
function( resolved, rejected ){ rejected && rejected(); };
complete = noop;
notify( !rejected ? 0 : 1 );
notify = noop;
thens = [];
},
notify = function( which ){
var then, callback, i = 0;
while ( ( then = thens[i++] ) ){
callback = then[which];
callback && callback();
}
};
this.then = function( resolved, rejected ){
thens.push( [resolved, rejected] );
};
this.resolve = function(){
resolved++;
probe();
};
this.reject = function(){
rejected++;
probe();
};
probe();
};
var when = function(){
var l = arguments.length,
promise = new Promise(l),
fn, i = 0;
while ( ( fn = arguments[i++] ) ){
fn( promise );
}
return promise;
};
return when;
} );