曾经做过一个注册页,很多的AJAX接口,多个分支,层层嵌套,感觉代码特别难看,都说Promise/A+规范可以解决这个问题,而现在主流框架都实现了这个规范,于是就去研究了一下。发现可以使用deferred对象,然后的就是调试,调试,再调试,感觉可以用下面的思路来解决我的问题。另外需要说一下,我使用的jquery是1.9的,如果使用1.12以后的版本好像defferred对象改动挺大的吧
<script type="text/javascript">
$(document).ready(function() {
var aa = $.Deferred();
var bb = $.Deferred();
var cc = $.Deferred();
/*先说一下then方法的使用*/
/*第一个deferred对象,并定义其成功或失败的回调函数*/
aa
.then(function(param1){
/*成功的回调函数*/
var param2 = '1st success params';
/*在这里决定调用第二个defferred对象的哪一个回调函数,这里调用的是成功的,并传入参数*/
bb.resolve(param2);
},function(param1){
/*失败的回调函数*/
var param2 = '1st fail params';
});
bb
.then(function(param2){
console.log(param2);
/*在这里决定调用第三个defferred对象的哪一个回调函数,这里调用的是失败的,并传入参数*/
var param3 = '2st success params';
cc.reject(param3);
},function(param2){
console.log(param2);
});
cc
.then(function(param3){
console.log(param3);
},function(param3){
console.log(param3);
/*回调函数链进行到这里*/
});
setTimeout(function(){
/*回调函数链的开始入口,这里调用了第一个defferred对象的成功回调,并传入第一个参数*/
aa.resolve(param1);
},1000);
/*然后是when方法的使用*/
$.when(aa,bb).done(function(param1,param2){
/*when是当传入异步操作都成功的时候执行的函数,但是后面也可以接then方法,那就可以定义成功和失败两个回调函数*/
console.log('aa和bb都成功了');
console.log(param1);
console.log(param2);
});
});
</script>