这就已经实现了上面的需求了。请求两个接口,获得两个数据,都成功时,对这两个数据同时进行处理。而且这种链式写法,让读者一目了然,而且便于维护扩展。
deferred方法汇总
提到的方法
$.Deferred():生成一个deferred对象。
$.when() 为多个操作指定回调函数。
deferred.done():指定操作成功后的回调函数
deferred.fail():指定操作失败后的回调函数
未提到的方法
•deferred.resolve()方法和deferred.reject()方法
deferred对象执行回调函数之前会有一个执行状态的存在,执行状态一共有三种———未完成、已完成和已失败。
未完成状态,则会继续等待,或者执行progress()指定的回调函数。
已完成状态,则会执行done()方法指定的回调函数。
已失败状态,则会执行fail()方法指定的回调函数。
所以这里的deferred.resolve()方法就是手动将deferred对象的状态改为已完成,继而执行done方法; deferred.reject()方法就是手动将状态改为已失败,继而执行fail方法。
下面来看一个例子:
var defer = $.Deferred(); // 新建一个Deferred对象 var wait = function(defer){ var tasks = function(){ defer.resolve(); // 改变Deferred对象为已完成状态 alert("执行完毕!"); }; setTimeout(tasks,5000); return defer; }; $.when(wait(defer)) .done(function(){ alert("succeed"); }) .fail(function(){ alert("failed"); });
结果:等待5秒钟,先弹出“succeed”,在弹出“执行完毕!”。
分析一下代码执行过程:
$.when()里面的参数是wait函数,也就是一个deferred对象,所以可以继续执行setTimeout函数,等待5s,执行tasks函数,然后手动改变了状态为“已完成”,所以执行done方法,弹出“succeed”,然后弹出“执行完毕!”。
deferred.then():有时为了省事,可以把done()和fail()合在一起写,这就是then()方法。
function successFun(){ alert("yes"); } function failFun(){ alert('fail'); } $.when($.ajax({ url: '/test/json/a.js', dataType:'json', type: 'get' })) .then(successFun, failFun);
当then方法只有一个参数时,相当于done方法。当有两个参数时,第一个相当于done方法,第二个相当于fail方法。
总结
deferred对象通过对一个ajax请求的各种回调函数的控制,让jquery写ajax变的简单、容易维护、容易扩展。
以上所述是小编给大家介绍的jQuery通过deferred对象管理ajax异步的相关知识,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
您可能感兴趣的文章: