什么是延迟列表(Deferred)

“延迟列表”你可以称呼它为“异步队列”或者“任务列表”。我不知到网上人们是怎么称呼它的,我就叫他异步队列吧!

什么是异步队列

异步队列是什么呢,这个问题其实我也不能表达清楚,举几个应用例子把:加入你有一个操作以来N个ajax返回数据;又如我有N个函数需要在domready的时候执行;又如这个模块的执行需要其他几个模块。这些情况我觉得都有个异步队列的应用在里面。

Deferred

jQuery的Deferred是在jQuery的函数列表(callbacks)的基础上建立起来的,具体源码可以参见jquery.com,实现了一系列api。本文要说的异步队列(Bee.Deferred)是一个简单实现版本。实现了如下的api:done,fail,resolve,reject,when,always,then这几个接口。

其中最重要的一个接口应该是when了。when可以传入一个和多个参数,参数可以是字符串、对象、Deferred对象、函数。Deferred 把when传入的参数作为任务队列,也就是该延迟队列触发需要满足的条件了。


Bee.Deferred

详细代码见 Bee.Deferred最后部分 ,代码演示如下:

//延迟列表测试
var def1 = Bee.Deferred();
var def2 = Bee.Deferred();
			
def1.when('task1');//队列1依赖task1
def1.done(function(){
	console.log('def1 done');
});
var fun2= function(){
	//标记当前函数任务完成
	//可以用 def2.resolve(arguments.callee)
	def2.resolve(true);
		
	//标记def1队列done
	def1.resolve('task1');
}
//队列2依赖队列1,和函数fun2和任务task2		
def2.when(fun2,def1,'task2');
def2.done(function(){
	console.log('def2 done!');
});
//标记def2的task2任务完成
def2.resolve('task2');
		
setTimeout(function(){
	fun2();//执行函数fun2
},2000);
  • 时间: November Nov, 2012
  • 分类:article
  • 标签:学习