DWR的同步问题
发布时间:2020-12-16 03:37:20 所属栏目:百科 来源:网络整理
导读:我在一次开发中遇到了DWR同步、异步的问题,WEB项目采用了DWR技术来实现前台调用后台代码,但是后台返回有 一个时间差,后续的代码会被先执行,这样就会导致执行的结果不正确,DWR默认是异步执行的,此时就需要修改为同步即可。 DWREngine.setAsync(false);/
我在一次开发中遇到了DWR同步、异步的问题,WEB项目采用了DWR技术来实现前台调用后台代码,但是后台返回有 一个时间差,后续的代码会被先执行,这样就会导致执行的结果不正确,DWR默认是异步执行的,此时就需要修改为同步即可。 DWREngine.setAsync(false); //你需要同步执行的代码 DWREngine.setAsync(true); 当然问题永远不会这么简单就解决了,项目经过许多人之手,很多代码、方法都是前人无数次修改后的成果,一旦修改为同步执行可能就会出现问题了。 而我遇到的问题也就是这样。 原来的代码: //test.js function pageOnLoad(){ //下面两个方法都将会调用后台方法 getPositionDetail(); updateOnLoad(); } 上面已经说了DWR默认是异步的,所以这两个方法是异步执行的,我需要在updateOnLoad方法执行前进行一些调用后台方法的判断,如果贸贸然修改为同步执行是会产生错误结果的,我使用了另外一种方法: //test.js function pageOnLoad(){ getPositionDetail(); UserMng.getUserInfo(function(data){//此处调用后台getUserInfo方法,使用回调方法,在回调方法中判断后再执行updateOnLoad方法 var flag = data; if(flag){updateOnLoad();} else{ btnSearch.style.displsy="none";//<span style="font-family: Arial,Helvetica,sans-serif;">btnSearch是一个按钮,此处需要将按钮隐藏</span> updateOnLoad();} }); }这样的修改是我进行了多次修改后的成果,此处既可以保证getPositionDeatil和updateOnLoad两个方法是异步执行的,为什么这么说,因为getPositionDetail和UserMng.getUserInfo是异步的嘛,也可以保证getUserInfo和updateOnLoad是同步执行的。因为updateOnLoad在getUserInfo中的回调方法中,所以必须等待getUserInfo结果返回到data后才会执行的,而回调方法中是顺序执行的,在两个判断中updateOnLoad都是最后一步,这样就保证了执行结果的正确性。如果需要在updateOnLoad之前调用后台方法,只需再写一个回调方法的嵌套即可。 此外,还有一些问题是回调方法也解决不了,比如下面这个问题: //click.js function btn_click(){//这是一个按钮点击事件 UserMng.updateUser(funtion(data){ if(data){return;} else{btn.disabled = true;} }); }这里,我需要在按钮点击事件中,在updateUser方法前做一调用后台方法的判断,再决定是否继续操作。如果只是用回调方法可能还不能达到预期效果,我是这样处理的: function btn_click(){//这是一个按钮点击事件 if(check()=="1"){alert("发生错误!");return;} UserMng.updateUser(funtion(data){ if(data){return;} else{btn.disabled = true;} }); } function check(){ DWREngine.setAsync(false); var flag; UserMng.checkUser(function(data){ flag = data; }); DWREngine.setAsync(true); return flag; } 我单独写了一个方法check,在check方法中先设置DWR同步执行,然后再调用后台方法,得到结果后再改回异步执行。执行方法已经改回异步了,怎么实现同步呢,在btn_click中在if的条件中执行check,因为if和upadteUser方法是顺序执行的,所以肯定会等待if的条件判断出来了才会往下执行,这里就间接实现了同步了。
最后,总结一下DWR的同步实现方法吧: 1.简单的使用DWR的参数的设置实现: DWREngine.setAsync(false); 2.使用回调方法,在回调方法中编写后续操作。 3.在if条件中执行需要被等待结果的方法。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |