1、deffer对象:jquery的回掉函数解决方案;含义是延迟到未来某个点再执行;

2、$.ajax链式写法:
$.ajax("test.php")
    .done(function() { console.log("success"); })   
    .fail(function() { console.log("fail"); })
3、指定同一操作的多个回调函数:
$.ajax("test.php")
    .done(function() { console.log("success"); })   
    .fail(function() { console.log("fail"); })
    .done(function() { console.log("success two"); })
4、为多个操作指定回调函数:若其中一个执行失败则执行fail回调;
$.when($.ajax("test.php"), $.ajax("test2.php"))
   .done(function() { console.log("success"); })   
   .fail(function() { console.log("fail"); })
5、普通操作的回调函数接口:
var dtd = $.Deferred(); // 新建一个deferred对象
var wait = function (dtd) {
    var tasks = function() {
        alert("执行完毕!");
        dtd.resole(); // 改变deferred对象的执行状态从”未完成“改为“已完成”,从而触发done()方法;
        // dtd.reject(); // 从“未完成”改为“已失败”,触发fail()方法;
    }
    setTimeout(tasks, ,5000);
    return dtd;
}
$.when(wait(dtd))
    .done(function() { console.log("success"); })   
    .fail(function() { console.log("fail"); })
 
    // dtd.resolve() 可以立即改变状态,5s后再触发多一次
6、用promise优化 全局defer对象,防止执行状态被外部改变:
var wait = function () {
    var dtd = $.Deferred(); // 新建一个deferred对象
    var tasks = function() {
        alert("执行完毕!");
        dtd.resole(); // 改变deferred对象的执行状态从”未完成“改为“已完成”,从而触发done()方法;
    }
    setTimeout(tasks, ,5000);
    return dtd.promise(); // 返回promise对象
};
$.when(wait())
    .done(function() { console.log("success"); })   
    .fail(function() { console.log("fail"); })
7、另一种防止执行状态被外部改变的方法:用deferred的构建函数:
$.Deferred(wait) // 接受一个函数名作为参数,注意是函数名
   .done(function() { console.log("success"); })   
   .fail(function() { console.log("fail"); })
8、最后一种防止执行状态被外部改变的方法:在wait对象上部署deferred接口:
var dtd = $.Defferred();
var wait = function(dtd) {
    var tasks = function() {
        alert("执行完毕!");
        dtd.resole(); // 改变deferred对象的执行状态从”未完成“改为“已完成”,从而触发done()方法;
    }
    setTimeout(tasks, ,5000);
 
}
dtd.promise(wait);
wait.done(function() { console.log("success"); })        
    .fail(function() { console.log("fail"); })
 
wait(dtd);
小结:deferred对象的方法:
(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() 为多个操作指定回调函数。
(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("已执行!");} );
 

Promise与Defer认识的更多相关文章

  1. 关于defer.promise.then 异步的一个疑问 | 用柯里化做promise | 用递归做promise

    疑问:感觉会报错,因为执行到defer.promise.then这时候还没到defer.resolve,因为异步读文件,总归会慢 解答:先执行defer.promise.then,是给callback ...

  2. promise的学习

    为了解决回调地狱的问题,所以出现了promise的设计思想. promise的三种状态: pending 等待状态 resolved 完成状态 rejected 拒绝状态 promise的三种状态,只 ...

  3. Javascript Promise 学习 (中)

    时隔多日,对promise有了多一点点的了解. 最近用angularjs 做开发,所以研究了一下它的 $q 功能不算很强大,算是简化版的 Q.js 参考了一下源码,不过我的等级还差很多... 作为学习 ...

  4. Node.js最新技术栈之Promise篇

    前言 大家好,我是桑世龙,github和cnodejs上的i5ting,目前在天津创业,公司目前使用技术主要是nodejs,算所谓的MEAN(mongodb + express + angular + ...

  5. 160701、理解 Promise 的工作原理

    Javascript 采用回调函数(callback)来处理异步编程.从同步编程到异步回调编程有一个适应的过程,但是如果出现多层回调嵌套,也就是我们常说的厄运的回调金字塔(Pyramid of Doo ...

  6. 160623、理解 Promise 的工作原理

    Javascript 采用回调函数(callback)来处理异步编程.从同步编程到异步回调编程有一个适应的过程,但是如果出现多层回调嵌套,也就是我们常说的厄运的回调金字塔(Pyramid of Doo ...

  7. jQuery中的Deferred和promise

    promise:http://www.alloyteam.com/2014/05/javascript-promise-mode/ 1 jQuery 中的 Deferred 和 Promises : ...

  8. 【转】angular Ajax请求

    1.http请求 基本的操作由 $http 服务提供.它的使用很简单,提供一些描述请求的参数,请求就出去了,然后返回一个扩充了 success 方法和 error 方法的 promise对象(下节介绍 ...

  9. zepto源码研究 - deferred.js(jquery-deferred.js)

    简要:zepto的deferred.js 并不遵守promise/A+ 规范,而在jquery v3.0.0中的defer在一定程度上实现了promise/A+ ,因此本文主要研究jquery v3. ...

随机推荐

  1. Gevent中信号量的使用

    greenlet间同步方法:信号量 1.为什么引入信号量: 2.gevent信号量有哪些: 3.编程实现. 为何引入信号量 信号量是一个允许Greenlet相互合作,限制并发访问或运行的低层次的同步原 ...

  2. Linux基础知识

    1.url中不写端口号,默认就是80端口:本机是127.0.0.1或者localhost 2.用户管理 查看当前用户: id:可以查看当前用户:whoami:查看当前的用户:who:可以查看当前已经登 ...

  3. console

    你所不知道的 Console 2016-12-19 ZHANGXIANGLIANG JavaScript 转自 https://segmentfault.com/a/119000000672160 1 ...

  4. Debian8.2 安装搜狗输入法

    搜狗输入法linux版本的推出,让linux的桌面使用变得更加顺手了,我之前一直就很想体验一下Linux下的搜狗输入法了,不过我对Linux系统使用还是个菜鸟,安装个输入法的简单事情也费了一番功夫. ...

  5. js 键盘记录实现(兼容FireFox和IE)(转)

    主要分四个部分 第一部分:浏览器的按键事件 第二部分:兼容浏览器 第三部分:代码实现和优化 第四部分:总结 第一部分:浏览器的按键事件 用js实现键盘记录,要关注浏览器的三种按键事件类型,即keydo ...

  6. 如何在VISIO 2010/2013 中关闭Shape protection(图形保护)

    最近在画UML图,用到MS visio 2010, 在使用一些网络查找到的图形的时候发现无法编辑,在网上找了找,翻译了下. Visio 2013 的图形保护功能,可以锁定图形的某些特定属性,使其无法被 ...

  7. Sql Server如何新建计划任务

    打开Sql Server数据库,在管理中找到维护计划功能,右击维护计划选择维护计划向导.如图所示: 打开维护计划向导后,在第一个步骤下输入计划名称. 输入完计划名称后,点击右下角的更改按钮,这里是配置 ...

  8. 原生JS实现购物车功能

    html <div class="catbox"> <table id="cartTable"> <thead> <t ...

  9. 我的毕业设计——基于安卓和.NET的笔记本电脑远程控制系统

    手机端: 电脑端:    答辩完成后会开放代码.

  10. 为什么.Net要求序列化的类必须有一个无参数的构造函数

    刚才用xml序列化器,序列化一个类,结果报错说序列化的类必须带有一个无参的构造函数,好奇怪啊.为什么要有这么苛刻的条件,而且xml序列化还要求序列化的成员是public. 我以前一直觉得序列化器是一个 ...