蝙蝠岛资源网 Design By www.hbtsch.com
本文实例讲述了javascript异步处理与Jquery deferred对象用法。分享给大家供大家参考,具体如下:
这是项目组老大整理的一些关于jquery 异步处理请求,以及使用 jquery deferred 对象的一些常见方法。虽然是项目上总结出来的。但也比较通用,分享在这里。
- 所有的Ajax操作都采用异步处理。
- 采用Jquery的Deffered对象来处理异步调用。
- 因为是异步调用,所以
$.Ajax
函数的返回值不代表返回的结果,只是一个Deffered对象。 - Ajax调用完成后执行的逻辑可以写成函数作为参数传递给Deffered对象的
done()
,fail()
,always()
函数来执行。 - 如果一个函数包含Ajax调用,那么这个函数必须将Ajax返回的异步对象作为自己的返回值,否则函数的调用者无法保证后续代码的正常执行顺序。
例如:
function readData(){ $.ajax({ url:"test", dataType:"json" }) .done(function() { //.... }); } readData(); //...这里想添加一些后续处理,但程序将在Ajax回调前执行,所以无法达到预期目的 正确的代码: function readData(){ return $.ajax({ url:"test", dataType:"json" }) .done(function() { //.... }); } readData().done(function () { //...想添加的后续处理可以加在这里处理 });
- 如果需要调用多个Ajax请求,请注意Ajax请求是否可以同时进行,如果可以应该使用
when()
函数来同时执行,以提高程序的运行效率和可读性。 - deferred对象有一个方法
promise()
,可以阻止其他代码修改deferred对象的状态,也就是其他代码调用reslove()
和reject
()无效。
var dtd = $.Deferred(); // 新建一个Deferred对象 var wait = function(dtd){ var tasks = function(){ alert("执行完毕!"); dtd.resolve(); // 改变Deferred对象的执行状态 }; setTimeout(tasks,5000); return dtd; }; wait(dtd) .done(function(){ alert("成功了!"); }) .fail(function(){ alert("出错啦!"); }); dtd.resolve(); //这里修改了dtd对象的状态,导致立刻出现“成功了!”的提示
正确的例子:
var dtd = $.Deferred(); // 新建一个Deferred对象 var wait = function(dtd){ var tasks = function(){ alert("执行完毕!"); dtd.resolve(); // 改变Deferred对象的执行状态 }; setTimeout(tasks,5000); return dtd.promise(); // 返回promise对象 }; wait(dtd) .done(function(){ alert("成功了!"); }) .fail(function(){ alert("出错啦!"); }); dtd.resolve(); //这里修改dtd对象的状态无效
- 一些情况的处理:
1.嵌套异步操作的处理。
如果一个函数内部执行异步任务,并且在异步任务的done回调内会嵌套另一个异步任务,那么简单返回第一个异步任务的返回值是不行的,需要另外自行定义一个Deferred对象作为返回值。
function loadComponent(id){ var dtd = $.Deferred(); //loadScript将异步加载一个js文件,所以返回值是一个Deffered对象 return loadScript(id) .done(function() { //js加载后,触发component的load事件,此事件内将使用Ajax获取页面模板和数据,生成最终的html app.getComponent(id).trigger("load") .done( function(){ dtd.reslove(agruments); }).fail( function(){ dtd.reject(agruments); }); }); //返回自定义的dtd对象,才能保证返回值的done回调在load事件完成后执行 return dtd; }
2.一个函数内同时包含同步和异步case
的处理。
/* 这个函数返回一个异步对象,当异步对象执行done时,表示component被加载完成 */ function requireComponent(id){ if (this.components[id]){ //如果component已经被加载,直接返回一个reslove的异步对象,否则返回值内容与else分支不同,后续代码难以处理 var dtd = $.Deferred(); dtd.reslove(this.getComponent(id)); return dtd; } else{ //如果component未被加载,loadScript将异步加载JavaScript并执行,然后将被加载的component放入this.components return loadScript(id); } }
- Jquery异步模型有一个缺点,就是缺乏类似
wait
操作的处理能力,如果多个异步调用要顺序发生时,就要在done里面嵌套处理,影响代码可读性.
aSyncTask1.done( function () { //...第一个操作完成后的处理 asyncTask2.done( function () { //...第二个操作完成后的处理 asyncTask3.done( function () { //...第三个操作完成后的处理 }); }) })
更多关于jQuery相关内容感兴趣的读者可查看本站专题:《jQuery form操作技巧汇总》、《jQuery文件与目录操作技巧汇总》、《jquery中Ajax用法总结》、《jQuery扩展技巧总结》、《jquery选择器用法总结》及《jQuery常用插件及用法总结》
希望本文所述对大家jQuery程序设计有所帮助。
蝙蝠岛资源网 Design By www.hbtsch.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
蝙蝠岛资源网 Design By www.hbtsch.com
暂无javascript异步处理与Jquery deferred对象用法总结的评论...
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
2024年12月28日
2024年12月28日
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]