DWR的同步问题

我在一次开发中遇到了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条件中执行需要被等待结果的方法。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章