deferred对象,是一个异步队列。能够实现异步代码调用,从而解决代码执行顺序的问题。

它提供了一下主要方法:

jQuery.Deferred()

一个构造函数,返回一个链式实用对象方法来注册多个回调,回调队列, 调用回调队列,并转达任何同步或异步函数的成功或失败状态。

deferred.always()

当Deferred(延迟)对象解决或拒绝时,调用添加处理程序

deferred.done()

当Deferred(延迟)对象解决时,调用添加处理程序

deferred.fail()

当Deferred(延迟)对象拒绝时,调用添加处理程序。

deferred.isRejected()

确定一个Deferred(延迟)对象是否已被拒绝。

deferred.isResolved()

确定一个Deferred(延迟)对象是否已被解决。

deferred.notify()

根据给定的 args参数 调用Deferred(延迟)对象上进行中的回调 (progressCallbacks)

deferred.notifyWith()

根据给定的上下文(context)和args递延调用Deferred(延迟)对象上进行中的回调(progressCallbacks )

deferred.pipe()

实用的方法来过滤 and/or 链Deferreds。

deferred.progress()

当Deferred(延迟)对象生成进度通知时,调用添加处理程

deferred.promise()

返回Deferred(延迟)的Promise(承诺)对象。

deferred.reject()

拒绝Deferred(延迟)对象,并根据给定的args参数调用任何失败回调函数(failCallbacks)

deferred.rejectWith()

拒绝Deferred(延迟)对象,并根据给定的 context和args参数调用任何失败回调函数(failCallbacks)。

deferred.resolve()

解决Deferred(延迟)对象,并根据给定的args参数调用任何完成回调函数(doneCallbacks)

deferred.resolveWith()

解决Deferred(延迟)对象,并根据给定的 context和args参数调用任何完成回调函数(doneCallbacks)

deferred.state()

确定一个Deferred(延迟)对象的当前状态

deferred.then()

当Deferred(延迟)对象解决,拒绝或仍在进行中时,调用添加处理程序。

jQuery.when()

提供一种方法来执行一个或多个对象的回调函数, Deferred(延迟)对象通常表示异步事件。

.promise()

返回一个 Promise 对象用来观察当某种类型的所有行动绑定到集合,排队与否还是已经完成

下面我自己写了一个小例子,有助于理解这个异步对象。程序背景,就是查询本地数据库之后需要做一些操作。

1.

 var shortName = 'table1';
var version = '1.0';
var displayName = 'personal Database';
var maxSize = 5*1024*1024; // bytes
DB = openDatabase(shortName, version, displayName, maxSize); CREATE TABLE IF NOT EXISTS message(id varchar(50) NOT NULL PRIMARY KEY, senderName varchar(200) NOT NULL,nickName varchar(200) NOT NULL,title TEXT, content TEXT,sendTime timestamp,type char(5),tag char(5) default 0,job varchar(20),recevierName varchar(50),readFlag char(5) default 0,sys varchar(20) not null); INSERT INTO message(id,senderName,nickName,title,content,sendTime,type,job,recevierName,sys) VALUES('01','lili','小红','你好!','hahahah','2015-04-10','1','','xx','1'); var obj = $.Deferred();
var select = function(def){
DB.transaction(
function (transaction) {
transaction.executeSql("select * from message group by senderName order by strftime('%s',sendTime) desc",[],
function(transaction, results){
def.resolve(results);
}, function(transaction, results){
def.reject(results);
});
});
return def;
}
$.when(select(obj)).done(function(data){//查询成功的回调
console.log(data)
}).fail(function(){//失败的回调
     console.log(data);
    });

2.

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

   var wait = function(dtd){

       alert("执行完毕!");

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

     return dtd;

   };

   $.when(wait(dtd))

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

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

另:

deferred.promise()方法

上面这种写法,还是有问题。那就是dtd是一个全局对象,所以它的执行状态可以从外部改变。

请看下面的代码:

  

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

  var wait = function(dtd){

    var tasks = function(){

      alert("执行完毕!");

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

    };

    setTimeout(tasks,5000);

    return dtd;

  };

  $.when(wait(dtd))

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

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

  dtd.resolve();

(运行代码示例8

我在代码的尾部加了一行dtd.resolve(),这就改变了dtd对象的执行状态,因此导致done()方法立刻执行,跳出"哈哈,成功了!"的提示框,等5秒之后再跳出"执行完毕!"的提示框。

为了避免这种情况,jQuery提供了deferred.promise()方法。它的作用是,在原来的deferred对象上返回另一个deferred对象,后者只开放与改变执行状态无关的方法(比如done()方法和fail()方法),屏蔽与改变执行状态有关的方法(比如resolve()方法和reject()方法),从而使得执行状态不能被改变。

请看下面的代码:

  

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

   var wait = function(dtd){

     var tasks = function(){

       alert("执行完毕!");

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

     };

     setTimeout(tasks,5000);

     return dtd.promise(); // 返回promise对象

   };

   var d = wait(dtd); // 新建一个d对象,改为对这个对象进行操作

   $.when(d)

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

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

   d.resolve(); // 此时,这个语句是无效的

(运行代码示例9

在上面的这段代码中,wait()函数返回的是promise对象。然后,我们把回调函数绑定在这个对象上面,而不是原来的deferred对象上面。这样的好处是,无法改变这个对象的执行状态,要想改变执行状态,只能操作原来的deferred对象。

不过,更好的写法是allenm所指出的,将dtd对象变成wait()函数的内部对象。

 

  var wait = function(dtd){

     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("出错啦!"); });

(运行代码示例10

对于deferred的一点点理解的更多相关文章

  1. Hadoop学习14--Hadoop之一点点理解yarn

    yarn是一个分布式的资源管理系统. 它诞生的原因是原来的MapReduce框架的一些不足: 1.JobTracker单点故障隐患 2.JobTracker承担的任务太多,维护Job状态,Job的ta ...

  2. 关于Sychronized和volatile自己总结的一点点理解(草稿)

    问答形式列举: 1. 为什么说sychronized能保证可见性 synchronized和Lock能保证同一时刻只有一个线程获取锁然后执行同步代码,并且在释放锁之前会将对变量的修改刷新到主存当中.因 ...

  3. retrofit一点点理解

    retrofit是什么? retrofit可以认为是一款基于http协议的rpc框架.基于java的. 它可以连到支持restful的服务器,将服务器返回的json数据反序列化成java对象. 用途 ...

  4. 对js中this的一点点理解

    1 当函数作为对象的方法被调用的时候 this就指向该对象 var o = { prop: 37, f: function() { return this.prop; } }; console.log ...

  5. 对Viewcontroller在UINavigationController中入栈出栈的一点点理解

    转载自:http://blog.csdn.net/intheair100/article/details/41119073 wait_record_arr 在viewdidload里面被alloc,如 ...

  6. Linux中shell和子shell一点点理解

    Linux执行脚本有两种方式,主要区别在于是否建立子shell   1.像sh,bash,./命令是用来执行shell脚本的,在bash/sh命令下,脚本文件可以无"执行权限",即 ...

  7. JavaScript构造函数、继承的理解

    前两天稍微深入一点点理解了原型和原型链,然后就开始有挺多疑问的: function dog() { this.name = "huahua"; } var cat = new do ...

  8. C#中委托的理解

    请注意,这只是个人关于C#中委托的一点点理解,参考了一些博客,如有不周之处,请指出,谢谢! 委托是一种函数指针,委托是方法的抽象,方法是委托的实例.委托是C#语言的一道坎,明白了委托才能算是C#真正入 ...

  9. 热修复-Tinker

    微信开源,真是喜出望外,必须要去看看啊,比起nuwa来微信好很多,而且github上也有专门的官方文档说明,还有很多资料查询 参考地址:https://github.com/Tencent/tinke ...

随机推荐

  1. C的|、||、&、&&、异或、~、!运算(转)

    位运算     位运算的运算分量只能是整型或字符型数据,位运算把运算对象看作是由二进位组成的位串信息,按位完成指定的运算,得到位串信息的结果. 位运算符有:     &(按位与).|(按位或) ...

  2. 编解码学习笔记(十):Ogg系列

    Ogg是一个自由且开放标准的容器格式,由Xiph.Org 基金会所维护.Ogg格式并不受到软件专利的限制,并设计用于有效率地串流媒体和处理高质量的数字多媒体. Ogg意指一种文件格式,能够纳入各式各样 ...

  3. UVA 246 - 10-20-30 (模拟+STL)

    UVA 246 - 10-20-30 题目链接 题意:给52张的扑克堆,先从左往右发7张牌,之后连续不断从左往右发7张牌,假设有牌堆形成了下面3种情况(按顺序推断): 1.头两张+尾一张和为10或20 ...

  4. RMAN数据库恢复 之归档模式有(无)备份-丢失数据文件的恢复

    1.归档模式有备份,丢失数据文件的恢复归档模式有备份,不管丢失什么数据文件,直接在RMAN下RESTOER--->RECOVER--->OPEN即可. RMAN> STARUP MO ...

  5. VB.NET Shared(共享)和 Static(静态)关键字的区别

    共享成员(Shared): VB.NET现在是支持真正的面向对象编程,可以继承.使用多态.共享成员 和静态成员. 共享成员就是在所有类和所定义派生类的实例之间共享的方法.属 性.字段和事件.所有使用类 ...

  6. Visual Studio宏注释模板

    前言 有时写代码需要写注释的时候 甚是苦恼 写吧 怕麻烦 不写吧 似乎这代码估计自己都看不懂 权衡之下 似乎找一个自动写注释的方法最靠谱 一直在VS下开发 偶尔听人说过有一个宏工具可以帮助开发者快速注 ...

  7. (原)STL中vector的疑问

    以前基本上没有用过STL,当然包括里面的vector.今天试验了一下. 主要看了这个网址: http://blog.csdn.net/phoebin/article/details/3864590 代 ...

  8. isNUll ,对于sql中的一个表的description的NULL和空格的处理

    select client.clientname ,description,'client2'= case when client.Description IS NULL then  client.c ...

  9. HttpClient 请求WebApi

    HttpClient client = new HttpClient(); client.BaseAddress = new Uri(ConfigurationManager.AppSettings[ ...

  10. python核心编程-第三章-习题

    1.这是python的语言特性,python先创建对象,在给变量赋值时,不需要定义变量的名称和类型,它实际是用变量引用对象.变量类型在给变量赋值时自动声明 2.原因类似变量无须声明类型 3.pytho ...