在JQ的延迟对象中,$.deferred()有比较多的下辖对象,下面将解析有那些对象,先把deferred封装起来:
var def = $.deferred();
$.deferred(fn) // 代表延迟执行开始前执行的对象fn()
def.done(fn) // 设定当延迟完成时要调用的对象fn()
def.fail(fn) // 设定当延迟完成使要调用的对象fn()
$.get(....).then(fn1, fn2) // 指定调用get时,不同情况下将调用不同的对象,如,调用成功则运行fn1,否则运行fn2;
def.reject("abc") // 把def的状态设置成拒绝(失败)的状态,并赋予相应失败函数"abc"的参数;
def.resolve("abc") // 把def的状态设置成接受(成功)的状态,并赋予相应成功函数"abc"的参数;
$("").promise().done(fn) // promise是对目标队列执行情况的检测,一旦队列执行完成(或失败)则马上调用程序,其特点是不用建立延迟对象;如在$("")队列下执行的函数都执行后,将执行fn;
def.always(fn) // 无论延迟对象执行的结果如何(成功或失败),都会执行函数fn;
def.progress(fn) // 当deferred对象生成进度通知时添加被访问程序fn;
def.notify("abc") // 与resolve或reject一样,notify改变延迟状态为进度通知状态,并赋予进度通知状态时所调用的函数以参数abc;
def.state() // 返回当前延迟函数的状态
延迟函数非常的有用,下面讲带上少量的script片段
<script>
$("button").bind( "click", function() {
$("p").append( "Started...");
$("div").each(function( i ) {
$( this ).fadeIn().fadeOut( 1000 * (i+1) );
});
$( "div" ).promise().done(function() { // 一旦绑定的元素状态为完成时,马上触发
$( "p" ).append( " Finished! " );
});
});
</script>