我在一次开发中遇到了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);
3.在if条件中执行需要被等待结果的方法。
原文链接:https://www.f2er.com/ajax/161748.html