jQuery的deferred对象使用详解
deferred对象在jQuery中,作为解决异步编程的一种有效手段,它代表了某个操作尚未完成的状态。其名字中的“defer”一词在英语中意为“延迟”,因此deferred对象代表着某个动作将在未来某个时间点执行。这种机制在编程中为我们提供了一种等待异步操作完成后再执行后续操作的方法。
之前在阅读相关demo时,我发现deferred对象的处理有时使用.done方法,有时使用.then方法。这让我这个对deferred对象一知半解的人感到困惑。今天我决定深入研究一下,发现这两种方法在某些特定环境下确实可以实现相同的效果。
让我们看看deferred.done的用法。创建一个deferred对象后,我们可以通过调用.resolve方法来解决这个对象。解决后的对象可以调用.done方法,并传入一个或多个回调函数作为参数。这些回调函数将在deferred对象被解决(resolve)时执行。这是一个非常直观和简单的方法,用于处理异步操作的结果。
接下来,我们再看看deferred.then的用法和特性。与.done方法类似,我们可以在deferred对象被解决时调用.then方法并传入一个回调函数作为参数。但.then方法还有其他特性,例如它允许你在deferred对象被拒绝(reject)时指定一个回调函数,以及在deferred对象状态改变时指定一个进度回调函数。.then方法还可以返回一个新的promise对象,允许你链式调用其他的方法,如.done、.fail和.then等。这使得.then方法在功能上比.done方法更强大,但也更复杂一些。
创建延迟对象
在JavaScript中,我们可以使用jQuery的Deferred对象来处理异步操作。例如,创建一个Deferred对象可以像这样做:var dtd = new $.Deferred(); 然后我们可以使用其提供的方法来操作和管理这个对象。
获取deferred对象状态
通过调用deferred对象的state()方法,我们可以知道这个对象当前的状态,它可能是pending(待处理)、resolved(已解决)或rejected(已拒绝)。这个方法不接受任何参数。
always方法
无论deferred对象是解决还是拒绝,always方法都会被执行。你可以为其提供一个函数或一个函数数组作为参数。这个方法很有用,因为它确保某些代码块总是会被执行,无论结果如何。
promise方法
promise方法用于防止其他代码干涉deferred对象的内部进度和状态。它返回一个新的promise对象,包含可以执行的方法,如done、fail、then、always等,但不包含修改Deferred状态的方法。当你需要返回deferred对象时,建议返回deferred.promise()。
resolve方法
调用resolve方法可以解决deferred对象,并触发所有已注册的done回调。你可以通过then方法的第一个参数设置done回调,也可以通过deferred.done()添加。此方法只接受一个参数,该参数将传递给done回调。只有deferred对象的创建者才能调用此方法。在done回调中,this指向的是deferred或promise对象。
resolveWith方法
resolveWith方法与resolve方法类似,但它允许你设置一个上下文对象(即this对象),这将改变done回调中的this指向。它还可以接受一个参数数组,done回调接收的参数个数将与数组长度相同。
reject方法
调用reject方法可以拒绝deferred对象,并触发所有已注册的fail回调。你可以通过then方法的第二个参数设置fail回调,也可以通过deferred.fail()添加。此方法只接受一个参数,该参数将传递给fail回调。只有deferred对象的创建者才能调用此方法。在fail回调中,this同样指向的是deferred或promise对象。
rejectWith方法
rejectWith方法与reject方法类似,但它也允许你设置一个上下文对象,这将改变fail回调中的this指向。它还可以接受一个参数数组,确定fail回调接收的参数个数。
notify方法
当deferred对象正在处理时,notify方法可以调用所有的progress回调。你可以通过then方法的第三个参数设置progress回调,也可以通过deferred.progress()添加。通常,只有deferred对象的创建者才能调用此方法,但可以通过deferred.promise()或then()方法来过滤。这个方法通常用于在异步操作进行中时提供反馈。参数可选,可以根据需要传递信息给progress回调。关于deferred对象的notify机制与其处理过程的故事。在这段叙述中,一个叫做dtd的对象通过调用其notifyWith方法,向deferred对象发出通知。当deferred对象进入已解决或已拒绝的状态后,这个通知机制将不再执行名为progressCallback的函数。换句话说,只有在deferred对象仍在处理过程中,才会调用所有的progressCallback函数。这听起来像一个复杂的流程,但它实际上在幕后默默运行,确保你的程序能够有序地进行。
这个notifyWith方法接受两个参数:一个上下文对象context和一个参数数组args。context就是我们的“this”对象,也就是调用者自身的上下文环境。当我们在progressCallback函数中引用“this”时,它实际上指向的是这个context对象。这意味着我们可以改变progressCallback函数中的“this”指向,使其指向我们想要的任何对象。这就是这个方法的独特之处。第二个参数args是一个数组,它的长度决定了progressCallback函数接收的参数个数。这是一个非常灵活的设计,允许我们根据需求传递任意数量的参数。
让我们进一步理解这个过程:当deferred对象开始处理任务时,它会调用所有的progressCallback函数。一旦deferred对象进入已解决或已拒绝的状态,无论我们如何尝试调用notifyWith方法,progressCallback都不会再被执行。这就是一个很重要的区分点,相比于resolve方法来说,notifyWith并不改变deferred对象的状态,只是在处理过程中进行通知和更新。在设计我们的程序时,我们必须确保在适当的时机调用notifyWith方法,以确保我们的回调函数能够正确地执行。这种机制让异步编程变得更为灵活和强大。最后一步是调用名为‘body’的元素的渲染方法:'body'.render()。这个方法将使得页面上的某个元素得以更新和展示。这个元素可能是我们刚刚处理过的deferred对象的结果展示区域。
微信营销
- jQuery的deferred对象使用详解
- 编写SQL需要注意的细节Checklist总结
- Element-ui之ElScrollBar组件滚动条的使用方法
- 基于javascript实现tab选项卡切换特效调试笔记
- 使用Browserify来实现CommonJS的浏览器加载方法
- Yii2框架中一些折磨人的坑
- Laravel使用swoole实现websocket主动消息推送的方法介
- 非常简单的Ajax请求实例附源码
- React Router V4使用指南(精讲)
- asp base64 utf-8为了兼容asp.net的base64
- 解析PHP无限级分类方法及代码
- JavaScript将XML转成JSON的方法
- SQL Server 数据库基本操作语句总结
- Vue验证码60秒倒计时功能简单实例代码
- Asp.Net MVC记住用户登录信息下次直接登录功能
- 分享有关jQuery中animate、slide、fade等动画的连续触