JQuery Deferred

基本实现原理

by springwang

JavaScript

// 模拟$.Deferred 的实现原理
function Deferred() {
	this.doneCallbacks = [];
	this.failCallbacks = [];
}

Deferred.prototype.done = function(cb){
	this.doneCallbacks.push(cb);
	return this;
};

Deferred.prototype.fail = function(cb){
	this.failCallbacks.push(cb);
	return this;
};

Deferred.prototype.resolve = function(){
	var dcbs = this.doneCallbacks;
	for(var i=0,len=dcbs.length;i<len;i++){
		dcbs[i]();
	}
	return this;
}

// 模拟$.when的实现
function when(){
	var aIdx = 0, aLen=arguments.length,
		dfd = new Deferred();
	
	function callback(){
		alert("已执行了[ " + ++aIdx + " ]个方法");
		if(aIdx == aLen) {
			dfd.resolve(); // 改变Deferred对象的执行状态
		}
	}
	
	for(var i=0; i< aLen; i++){
		arguments[i].done(callback);
	}
	return dfd;
}

// 自定义方法
var wait = function(intval){
    var dfd = new Deferred(); //在函数内部,新建一个Deferred对象
    var tasks = function(){
        alert("耗时[ "+intval/1000+" ]秒的操作执行完毕!");
        dfd.resolve(); // 改变Deferred对象的执行状态
    };
    setTimeout(tasks,intval);
    return dfd; // 返回Deferred对象
};

// 调用测试
when(wait(5000),wait(10000)).done(function(){alert('调用第一个done');}).done(function(){alert('调用第二个done');});