jQuery的deferred对象使用详解

2020-05-23 06:22:02易采站长站整理


  .fail(function(){ alert(“出错啦!”); });


    但是,有一个问题。$.when()的参数只能是deferred对象,所以必须对wait进行改写:


  var dtd = $.Deferred(); // 新建一个deferred对象


  var wait = function(dtd){


    var tasks = function(){


      alert(“执行完毕!”);


      dtd.resolve(); // 改变deferred对象的执行状态


    };


    setTimeout(tasks,5000);


    return dtd.promise();


  };


这里有两个地方需要注意。


    首先,最后一行不能直接返回dtd,必须返回dtd.promise()。原因是jQuery规定,任意一个deferred对象有三种执行状态—-未完成,已完成和已失败。如果直接返回dtd,$.when()的默认执行状态为”已完成”,立即触发后面的done()方法,这就失去回调函数的作用了。dtd.promise()的目的,就是保证目前的执行状态—-也就是”未完成”—-不变,从而确保只有操作完成后,才会触发回调函数。


    其次,当操作完成后,必须手动改变Deferred对象的执行状态,否则回调函数无法触发。dtd.resolve()的作用,就是将dtd的执行状态从”未完成”变成”已完成”,从而触发done()方法。


    最后别忘了,修改完wait之后,调用的时候就必须直接传入dtd参数。


  $.when(wait(dtd))


  .done(function(){ alert(“哈哈,成功了!”); })


  .fail(function(){ alert(“出错啦!”); });


(运行代码示例5)


六、普通操作的回调函数接口(中)


    除了使用$.when()为普通操作添加回调函数,还可以使用deferred对象的建构函数$.Deferred()。


这时,wait函数还是保持不变,我们直接把它传入$.Deferred():


  $.Deferred(wait)


  .done(function(){ alert(“哈哈,成功了!”); })


  .fail(function(){ alert(“出错啦!”); });


(运行代码示例6)


jQuery规定,$.Deferred()可以接受一个函数作为参数,该函数将在$.Deferred()返回结果之前执行。并且,$.Deferred()所生成的Deferred对象将作为这个函数的默认参数。


七、普通操作的回调函数接口(下)


    除了上面两种方法以外,我们还可以直接在wait对象上部署deferred接口。


  var dtd = $.Deferred(); // 生成Deferred对象


  var wait = function(dtd){


    var tasks = function(){