jQuery的deferred对象


推荐使用 示例2示例3 .
示例1:普通方式,全局对象, 不提倡.
var dtd = $.Deferred();  // 新建一个Deferred对象  
var wait =  function (dtd) {
     var tasks =  function () {
        alert( "执行完毕!");
        dtd.reject();  // 改变Deferred对象的执行状态
       /*dtd.reject()//变成已失败
        dtd.resolve()//变成已完成
        dtd.progress(callbacks)//正在进行中 */

    };
    setTimeout(tasks,  5000); //在task函数外面,所以仅执行一次
     return dtd.promise();  // 返回promise对象
};
var d = wait(dtd);  // 新建一个d对象,改为对这个对象进行操作
$.when(d).done( function () {
    alert( "哈哈,成功了!");
})
.fail( function () {
    alert( "出错啦!");
});
d.resolve();  // 此时,这个语句是无效的


示例2:在 函数内部建立对象,防止执行状态被外部改变. 推荐使用.
var wait =  function () {
     var dtd = $.Deferred();  //在函数内部,新建一个Deferred对象
     var tasks =  function () {
        alert( "执行完毕!");
        dtd.resolve();  // 改变Deferred对象的执行状态
    };
    setTimeout(tasks,  5000);
     return dtd.promise();  // 返回promise对象
};
$.when(wait())
.done( function () {
    alert( "哈哈,成功了!");
})
.fail( function () {
    alert( "出错啦!");
});


示例3:防止被外部改变,使用deferred对象的建构函数$.Deferred(参数);
参数是一个函数名(函数对象),不是字符串;
推荐使用.
var wait =  function (dtd) {
     var tasks =  function () {
        alert( "执行完毕!");
        dtd.resolve();  // 改变Deferred对象的执行状态
    };
    setTimeout(tasks,  5000);
     return dtd.promise();
};
$.Deferred(wait)
.done( function () {
    alert( "哈哈,成功了!");
})
.fail( function () {
    alert( "出错啦!");
});

示例4:
var dtd = $.Deferred();  // 生成Deferred对象
var wait =  function (dtd) {
     var tasks =  function () {
        alert( "执行完毕!");
        dtd.resolve();  // 改变Deferred对象的执行状态
    };
    setTimeout(tasks,  5000);
};
dtd.promise(wait);
wait.done( function () {
    alert( "哈哈,成功了!");
})
.fail( function () {
    alert( "出错啦!");
});
wait(dtd);
dtd.promise(wait)这一行,它的作用就是在wait对象上部署Deferred接口。正是因为有了这一行,后面才能直接在wait上面调用done()和fail()。

总结:

  (1) $.Deferred() 生成一个deferred对象。

  (2) deferred.done() 指定操作成功时的回调函数

  (3) deferred.fail() 指定操作失败时的回调函数

  (4) deferred.promise() 没有参数时,返回一个新的deferred对象,该对象的运行状态无法被改变;接受参数时,作用为在参数对象上部署deferred接口。

  (5) deferred.resolve() 手动改变deferred对象的运行状态为"已完成",从而立即触发done()方法。

  (6)deferred.reject() 这个方法与deferred.resolve()正好相反,调用后将deferred对象的运行状态变为"已失败",从而立即触发fail()方法。

  (7) $.when() 为多个操作指定回调函数。

除了这些方法以外,deferred对象还有二个重要方法,上面的教程中没有涉及到。

  (8)deferred.then()

有时为了省事,可以把done()和fail()合在一起写,这就是then()方法。

  $.when($.ajax( "/main.php" ))

.then(successFunc, failureFunc );

如果then()有两个参数,那么第一个参数是done()方法的回调函数,第二个参数是fail()方法的回调方法。如果then()只有一个参数,那么等同于done()。

  (9)deferred.always()

这个方法也是用来指定回调函数的,它的作用是,不管调用的是deferred.resolve()还是deferred.reject(),最后总是执行。

  $.ajax( "test.html" )

  .always( function() { alert("已执行!");} );




 JavaScript Code 
// 3 functions to call when the Deferred object is resolved
function fn1() {
    $( "p").append( " 1 ");
}
function fn2() {
    $( "p").append( " 2 ");
}
function fn3(n) {
    $( "p").append(n +  " 3 " + n);
}
// Create a deferred object
var dfd = $.Deferred();
// Add handlers to be called when dfd is resolved
dfd
// .done() can take any number of functions or arrays of functions
.done([fn1, fn2], fn3, [fn2, fn1])
// We can chain done methods, too
.done( function (n) {
    $( "p").append(n +  " we're done.");
});
// Resolve the Deferred object when the button is clicked
$( "button").on( "click"function () {
    dfd.resolve( "and");
});
 
HTML Code 
<button>Go </button>
<p>Ready... </p>

运行结果,点击button后,打印:
Ready... 1 2 and 3 and 2 1 and we're done.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
jQuery Deferred 对象提供了一种优雅的方式来处理异步操作,它可以让我们更方便地控制异步操作的状态和执行顺序。下面是 Deferred 对象的常用方法: 1. $.Deferred():创建一个 Deferred 对象。 2. deferred.done():当 Deferred 对象的状态变为已完成时,调用该方法注册的回调函数。 3. deferred.fail():当 Deferred 对象的状态变为已失败时,调用该方法注册的回调函数。 4. deferred.always():无论 Deferred 对象的状态是已完成还是已失败,都调用该方法注册的回调函数。 5. deferred.then():当 Deferred 对象的状态变化时,调用该方法注册的回调函数。它可以接受两个参数,第一个参数是已完成状态的回调函数,第二个参数是已失败状态的回调函数。 6. deferred.promise():返回一个 Promise 对象,该对象可以被传递给其他函数或者方法,但只能调用 then()、catch() 和 finally() 方法,不能改变 Deferred 对象的状态。 下面是一个使用 Deferred 对象的示例代码: ```javascript function asyncAction() { var defer = $.Deferred(); setTimeout(function() { defer.resolve("Async Action Completed!"); }, 2000); return defer.promise(); } var promise = asyncAction(); promise.then(function(data) { console.log(data); }).fail(function() { console.log("Async Action Failed!"); }).always(function() { console.log("Async Action Done!"); }); ``` 在这个例子,我们定义了一个 asyncAction() 函数,它返回一个 Deferred 对象。在该函数内部,我们使用 setTimeout() 函数模拟一个异步操作,并在两秒后调用 resolve() 方法,将 Deferred 对象的状态设置为已完成。然后我们使用 promise 变量保存该 Deferred 对象的 Promise 对象,并使用 then()、fail() 和 always() 方法注册回调函数。在 then() 方法,输出异步操作完成的信息;在 fail() 方法,输出异步操作失败的信息;在 always() 方法,输出异步操作完成的信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值