这个函数非常重要,将来会成为jQuery的核心方法。它彻底改变了jQuery中如何使用ajax。为了实现它,jQuery的所有ajax代码都被重写了。但是比较抽象,初学者很难掌握,网上教程也不多。所以我整理了学习笔记,希望对大家有用。本文不是初学者教程,而是针对已经有使用jQuery经验的开发人员。想了解jQuery的基本用法,请阅读我写的《jQuery设计思想》和《jQuery最佳实践》。
1.什么是递延对象?在网站开发过程中,我们经常会遇到一些耗时的javascript操作。其中,既有异步操作(如ajax读取服务器数据),也有同步操作(如遍历一个大数组),不能立即得到结果。通常的解决方案是为它们指定回调函数。也就是说,预先指定哪些函数一旦完成就应该被调用。但是在回调函数方面,jQuery非常弱。为了改变这种情况,jQuery开发团队设计了延迟对象。简单来说,延迟对象就是jQuery的回调函数解决方案。在英语中,delay的意思是“延迟的”,所以delay宾语的意思是“延迟的”直到将来的某个时候。它解决了如何处理耗时操作的问题,并提供了对这些操作的更好控制和统一的编程接口。它的主要功能可以归纳为四点。让我们通过示例代码逐步学习。二、ajax操作的链式编写jQuery的ajax操作传统上编写如下:$。Ajax ({url:' test.html ',success3360function () {alert '(哈哈,成功了!);},error:function(){alert('出错了!');}});(运行代码示例1)在上面的代码中,$。ajax()接受一个对象参数,该参数包含两种方法:success方法指定操作成功后的回调函数,error方法指定操作失败后的回调函数。在$之后。ajax()操作完成后,如果使用版本低于1.5.0的jQuery并返回一个XHR对象,则不能执行链式操作。如果高于1.5.0版本,返回的对象被延迟,可以进行链式操作。现在,新的写法是这样的:$。Ajax ('test.html ')。done (function () {alert('哈哈,成功了!'。);}).fail(function(){ alert('出错了!'。);});(运行代码示例2)可以看出,done()相当于success方法,fail()相当于error方法。采用链式编写后,代码的可读性大大提高。第三,为同一个操作指定多个回调函数。延迟对象的优点之一是它允许您自由添加多个回调函数。以上面的代码为例。如果在ajax操作成功后,我想在原来的回调函数之外运行另一个回调函数呢?很简单,加到后面就行了。$.Ajax ('test.html ')。done (function () {alert('哈哈,成功了!);} ).fail(function(){ alert('出错了!'。);} ).done(function(){ alert('第二个回调函数!');} );(运行代码示例3)可以添加任意数量的回调函数,并且它们按照添加的顺序执行。4.为多个操作指定回调函数延迟对象的另一个优点是,它允许您为多个事件指定回调函数,这是传统编写无法做到的。看看下面的代码,它使用了一个新的方法$。when (): $。when ($。Ajax ('test1.html '),$。Ajax ('test2.html ')。done (function () {alert('哈哈,成功了!'。);}).fail(function(){ alert('出错了!'。);});(运行代码4的示例)这段代码意味着执行两个操作$。ajax('test1.html ')和$。ajax('test2.html ')首先,如果成功,运行done()指定的回调函数;如果一个或两个都失败,执行由fail()指定的回调函数。五、常见操作的回调函数接口(上)延迟对象最大的优点是它将这组回调函数接口从ajax操作扩展到了所有操作。也就是说,任何操作——无论是ajax操作还是本地操作、异步操作还是同步操作——都可以使用各种方法的延迟对象来指定回调函数。我们来看一个具体的例子。假设有一个耗时的操作:wait:var wait=function(){ var tasks=function(){ alert('执行完成!);};setTimeout(任务,5000个);};我们为它指定了一个回调函数。我们做什么呢自然,你会认为你可以使用$。when (): $。when (wait())。done (function () {alert('哈哈,成功了!);}).fail(function(){ alert('出了点问题!);});但是,有一个问题。
$的参数。when()只能是一个延迟对象,所以wait必须重写:var dtd=$。递延();//创建新的延迟对象varwait=function(dtd){ vartasks=function(){ alert('执行已完成!'。);dtd . resolve();//更改延迟对象的执行状态};setTimeout(任务,5000个);return dtd . promise();};这里有两个地方需要注意。首先,最后一行不能直接返回dtd,但必须返回dtd.promise()。原因是jQuery规定任何延迟对象都有三种执行状态——未完成、完成和失败。如果直接返回dtd,则默认执行状态为$。当()为‘Completed’时,会立即触发done()方法,从而失去回调函数的功能。dtd.promise()的目的是确保当前的执行状态,即“未完成”保持不变,从而确保回调函数只有在操作完成后才会被触发。其次,操作完成后,必须手动更改delivered对象的执行状态,否则无法触发回调函数。dtd.resolve()的功能是将dtd的执行状态从“未完成”更改为“已完成”,从而触发done()方法。最后,别忘了,修改wait后,调用时必须直接传入dtd参数。$.when (wait (dtd))。done (function () {alert('哈哈,成功了!'。);}).fail(function(){ alert('出错了!'。);});(运行代码示例5) VI。普通操作的回调函数接口(中)除了用$添加普通操作的回调函数。当()时,还可以使用带有$的延迟对象的构造函数。延期()。此时,等待函数保持不变,所以我们直接传入$。递延():美元。延期(等待)。done (function () {alert('哈哈,成功了!'。);}).fail(function(){ alert('出错了!'。);});(运行代码示例6)jQuery规定$。delivered()可以接受一个函数作为参数,它将在$之前执行。delivered()返回结果。此外,由$生成的延迟对象。delivered()将用作该函数的默认参数。七、普通操作回调函数接口(下图)除了以上两种方法,我们还可以直接在wait对象上部署延迟接口。var dtd=$。递延();//生成延迟对象varwait=function(dtd){ vartasks=function(){ alert('执行已完成!'。);dtd . resolve();//更改延迟对象的执行状态};setTimeout(任务,5000个);};dtd.promise(等待);Wait.done(function(){ alert('哈哈,成功了!');}).fail(function(){ alert('出错了!'。);});等待(dtd);(运行代码示例7)这里的关键是行dtd.promise(wait),它用于在wait对象上部署delivered接口。因为这一行,我们可以在等待时直接调用done()和fail()。八.总结:延期对象的方法延期对象的各种方法前面都提到过,下面是总结:(1)$。delivered()生成一个延迟对象。(2)delivered . done()指定操作成功时的回调函数;(3)delivered . fail()指定操作失败时的回调函数;以及(4)delivered . promise()没有参数,用于保持delivered对象的运行状态不变。当参数被接受时,它用于在参数对象上部署延迟接口。(5)delivered . resolve()手动将延迟对象的运行状态更改为“completed”,从而立即触发done()方法。(6)$.when()为多个操作指定回调函数。除了这些方法之外,延迟对象还有三个重要的方法,这些方法在上面的教程中没有涉及到。有时,为了省事,你可以把done()和fail()写在一起。这是当时的()方法。$.when($。ajax('/main.php '))。然后(成功函数,失败函数);如果then()有两个参数,第一个参数是done()方法的回调函数,第二个参数是fail()方法的回调方法。如果then()只有一个参数,则相当于done()。(8)delivered . reject()与deferred.resolve()正好相反。被调用后,它将延迟对象的运行状态更改为“失败”,从而立即触发fail()方法。(9)方法9)delivered . always()也用于指定回调函数,它的作用是无论调用deferred.resolve()还是deferred.reject()都始终执行回调函数。
$.ajax('test.html ').总是(函数(){ alert('已执行!');} );(完)