javascript异步处理与Jquery deferred对象用法总结
前端  /  管理员 发布于 4年前   322
本文实例讲述了javascript异步处理与Jquery deferred对象用法。分享给大家供大家参考,具体如下:
这是项目组老大整理的一些关于jquery 异步处理请求,以及使用 jquery deferred 对象的一些常见方法。虽然是项目上总结出来的。但也比较通用,分享在这里。
$.Ajax
函数的返回值不代表返回的结果,只是一个Deffered对象。done()
, fail()
, always()
函数来执行。例如:
function readData(){ $.ajax({ url:"test", dataType:"json" }) .done(function() { //.... });}readData();//...这里想添加一些后续处理,但程序将在Ajax回调前执行,所以无法达到预期目的正确的代码:function readData(){ return $.ajax({ url:"test", dataType:"json" }) .done(function() { //.... });}readData().done(function () { //...想添加的后续处理可以加在这里处理});
when()
函数来同时执行,以提高程序的运行效率和可读性。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); }}
wait
操作的处理能力,如果多个异步调用要顺序发生时,就要在done里面嵌套处理,影响代码可读性.aSyncTask1.done( function () { //...第一个操作完成后的处理 asyncTask2.done( function () { //...第二个操作完成后的处理 asyncTask3.done( function () { //...第三个操作完成后的处理 }); })})
更多关于jQuery相关内容感兴趣的读者可查看本站专题:《jQuery form操作技巧汇总》、《jQuery文件与目录操作技巧汇总》、《jquery中Ajax用法总结》、《jQuery扩展技巧总结》、《jquery选择器用法总结》及《jQuery常用插件及用法总结》
希望本文所述对大家jQuery程序设计有所帮助。
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号