原文地址:http://www.cnblogs.com/lvdabao/p/jquery-deferred.html?utm_source=tuicool&utm_medium=referral html
看过第一篇,再看jquery领悟不少。jquery
jquery的defferd和ES6中的有很大不一样,概念相似,名称不一样。尤为是Deferred和ajax的关系,如今也搞不清面试
一、声明一个Deferredajax
var def = $.Deferred(); //定义一个defferd对象 setTimeout(function(){ console.log('执行完成'); def.resolve('随便什么数据'); //此处和ES6的区别 }, 2000); return def; //建议返回 def.promise(); 其实他就是一个返回受限Deferred对象的方法,防止外部乱用
二、Jquery的Deferred的三个状态:pending resolved rejectedpromise
经过def.state()来返状态。异步
三、jquery文档中写:函数
我不太好理解这个filter,仍是想用fun来表述这个参数的意思,因而至关于:测试
var def = $.Deferred(); def.then(doneFun,failFun,progressFun);
由这三个函数来为执行的结果进行响应。ES6中只有成功或失败两个状态,jquery来扩充了一下正执行这么一个状态。ui
四、比较:done,fail,progress 的区别spa
完成 | 失败 | 待定 |
|
状态 | resolved | rejected | pending |
触发的命令 | def.resolve("XXXX"); | def.reject("XXXX"); | def.notify("XXXX"); |
执行状态回调 | def.done( doneFun ); | def.fail( failFun ); | def.progress( progressFun) |
then执行回调 |
doneFun | failFun | progressFun |
jquery的同义词 | $.ajax().success() | $.ajax().error() |
猛地一看,可能不太懂,我把我测试代码贴上就明白了
def = $.Deferred() def.done(function(data) { console.log("完成" + data); }) //d.resolve("xxxx")来触发 .fail(function(data) { console.log("未完成" + data); }) //d.reject("xxxx")来触发 .progress(function(data) { console.log("进行中" + data); }) //d.notify("xxxx")来触发 //如下代码功能同上。 def = $.Deferred() def.then(function(data) { console.log("完成" + data); }, function(data) { console.log("未完成" + data); }, function(data) { console.log("进行中" + data); }) //如下为触发代码: def.notify(1) // 进行中1 def.notify(50) // 进行中50 def.resolve("done") // 完成done def.notify(100) // 无任何效果。也就是说只有在pending时,才能notify.
五、def.always( alwaysFun ) 不管成功失败,都执行该函数。
经测,def.notify() 不会触发alwaysFun. ajax中的同义词为:$.ajax().complete( )
六、$.when的用法
和Es6不一样的是,接受的不是一个数据。then响应的值数据时,也不是数据。记住这个格式便可
$.when(runAsync(), runAsync2(), runAsync3()) .then(function(data1, data2, data3){ console.log('所有执行完成'); console.log(data1, data2, data3); });
jquery中没有像ES6中的race方法。
七、ajax与Deferred的关系
该部分照抄原文。没什么好补充的,请记住只用done,fail,always便可。
jquery的ajax返回一个受限的Deferred对象,还记得受限的Deferred对象吧,也就是没有resolve方法和reject方法,不能从外部改变状态。
$.ajax(/*...*/) .success(function(){/*...*/}) .error(function(){/*...*/}) .complete(function(){/*...*/})
分别表示ajax请求成功、失败、结束的回调。这三个方法与Deferred又是什么关系呢?其实就是语法糖,success对应done,error对应fail,complete对应always,就这样,只是为了与ajax的参数名字上保持一致而已,更方便你们记忆,看一眼源码:
deferred.promise( jqXHR ).complete = completeDeferred.add; jqXHR.success = jqXHR.done; jqXHR.error = jqXHR.fail;
complete那一行那么写,是为了减小重复代码,其实就是把done和fail又调用一次,与always中的代码同样。deferred.promise( jqXHR )这句也能看出,ajax返回的是受限的Deferred对象。
jquery加了这么些个语法糖,虽然上手门槛更低了,可是却形成了必定程度的混淆。一些人虽然这么写了好久,却一直不知道其中的原理,在面试的时候只能答出一些皮毛,这是很很差的。这也是我写这篇文章的原因。
jquery中Deferred对象涉及到的方法不少,本文尽可能分门别类的来介绍,但愿能帮你们理清思路。总结一下就是:$.Deferred实现了Promise规范,then、done、fail、always是Deferred对象的方法。$.when是一个全局的方法,用来并行运行多个异步任务,与ES6的all是一个功能。ajax返回一个Deferred对象,success、error、complete是ajax提供的语法糖,功能与Deferred对象的done、fail、always一致。就酱。