JS异步方案

(function(){
    function nextTick(fn){setTimeout(fn,0)}
    function getType(obj){return Object.prototype.toString.call(obj)}
    function isList(obj){return /Array|Arguments/.test(getType(obj))}
    function isFunc(obj){return /Function/.test(getType(obj))}
    function isNone(obj){return /Undefined/.test(getType(obj))}
    function func(fn){fn.apply(null,[].slice.call(arguments,1))}
    function run(fn,callback){nextTick(function(){fn(function(){callback()})})}
    function map(list,fn,callback){
        var i,l=list.length,c=l-1;
        if(l){for(i=0;i<l;i++) (function(n,done){nextTick(function(){fn(list[n],done)})})(i,function(){!c--&&callback()});}
        else callback()
    }
    function all(list,callback){
        var i,l=list.length,c=l-1;
        if(l){for(i=0;i<l;i++) (function(n,done){nextTick(function(){list[n](done)})})(i,function(){!c--&&callback()});}
        else callback()
    }
    function factory(callback,a,b){
        var _next;
        if(isFunc(a)&&isNone(b)){_next=function(){run(a,callback)}}
        if(isList(a)&&isNone(b)){_next=function(){all(a,callback)}}
        if(isList(a)&&isFunc(b)){_next=function(){map(a,b,callback)}}
        return _next;
    }
    function Chain(a,b){
        if(!(this instanceof Chain)) return new Chain(a,b);
        var self=this;
        self.chain=[];
        self.chain.push(factory(function(){if(self.chain.length) nextTick(self.chain.shift())},a,b))
        nextTick(self.chain.shift());
        return self;
    }
    Chain.prototype.$=function(a,b){
        var self=this;
        self.chain.push(factory(function(){if(self.chain.length) nextTick(self.chain.shift())},a,b))
        return self;
    }
    window.Chain=Chain;
})();

其实就是去掉了ThenJS里我不想要的部分。。。

posted @ 2016-11-25 12:12  叮了个嘣  阅读(140)  评论(0)    收藏  举报