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條件中執行需要被等待結果的方法。



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