2013-02-19 92 views
0

我有一個簡單的jsonRpcService與返回true或false的方法。有什麼辦法讓jsonRpcService同步工作嗎?

我有一個CCJS和SSJS事件代碼的按鈕。如果RPC返回true,我想停止代碼執行,但是,它看起來代碼在addCallBack完成之前觸發並且在SSJS上執行代碼或正在執行代碼

有沒有任何方法可以在繼續執行任何其他CCSJ之前等待addCallBack響應指令或SSJS代碼。我期待的返回false將停止任何代碼執行。

這裏我的代碼:

var lastupdate = '#{javascript:document1.getDocument().getLastModified().toString();}'; 
var myobject = rpcDocLock.checkUpdate(lastupdate); 
myobject.addCallback(function(modified){ 
    alert(modified); // #2 
    if (modified){ 
     alert("This document has been modified."); // #3 
     return false; 
    } 
}); 

alert("This alert is triggered and RPC has not finished its execution.") // #1 

我加了3個警報,所以你可以看到他們正在執行的順序。

+0

只需在* addCallBack *函數中移動應該在回調後執行的代碼。 – 2013-02-19 15:27:52

+0

我試過@SvenHasselbach。我添加了一個else語句中的addCallback:'myobject.addCallback(功能(修改){ \t警報(修改); //#2 \t如果(修改){ \t \t警報(「該文件已被修改。「); //#3 \t \t \t \t返回FALSE; \t}其他{ \t \t validateForm(); \t} });'問題是我的按鈕有代碼也SSJS,所以這是爲不管什麼結果addCallback觸發我想要的是停止任何代碼執行,如果RCP方法返回** true ** – PSolano 2013-02-19 15:48:33

+0

因此,如果我正確讀取這個事件的客戶端部分觸發服務器代碼確定事件的服務器部分是否應該運行爲什麼不把這個邏輯移動到事件的服務器部分,所以所有的服務器代碼都從一個入口點運行? – 2013-02-20 02:55:25

回答

1

在您的按鈕,添加以下代碼行獲得有關Dojo XHR請求控制:

if(! dojo._xhr) 
    dojo._xhr = dojo.xhr; 

dojo.xhr = function (args, ioArgs, addArgs){ 
    ioArgs["sync"] = true; 
    return dojo._xhr(args, ioArgs, addArgs); 
} 

這將迫使所有的調用是同步(該塊瀏覽器,禁用超時等) 。 在這裏看到更多:dojo.xhrGet supported object properties

現在你可以打電話給你的RPC調用:

var myobject = rpcDocLock.checkUpdate(lastupdate); 
myobject.addCallback(function(modified){ 

    // -=> RESET DOJO XHR CALL BACK FIRST! 
    dojo.xhr = dojo._xhr; 
    delete(dojo._xhr); 

    // -=> DO THE OTHER STUFF 
    alert(modified); // #2 
    if (modified){ 
     alert("This document has been modified."); // #3 
     return false; 
    } 
}); 

我不知道當RPC調用失敗到底發生了什麼,但是這可能會停止所有CSJS(它是同步)。

+0

這很棒@Sven RPC現在已經同步;然而,返回false僅僅是從addCallback及其在SSJS上的執行代碼退出。我必須在if語句內部分配一個變量結果,然後在addCallback之後檢查它的值:'if(modified){alert(「This document has been modified。」); //#2 \t \t result = false; \t \t return false; \t \t alert(「This should not be displayed。」); //#? \t}'如果可以停止代碼執行的任何想法? – PSolano 2013-02-20 12:30:02

+0

是的,在你的按鈕中創建一個變量:* var ret = true; *然後根據需要更改回調函數中的變量值(* ret = false *)。 CSJS中的最後一行代碼返回* ret *。 – 2013-02-20 21:01:46

1

您絕對不應該在網頁瀏覽器中編寫阻止代碼,因爲如果您將瀏覽器掛起。這就是爲什麼你有回調函數,如果你需要從服務器取回某些東西,繼續你的代碼。

您還可以在刷新完成後觸發onComplete事件。

============================================== ======= 編輯

這是我如何解決問題的兩種方法。

  1. 客戶端使用的回調函數SSJS代碼移到一個隱藏按鈕(CSS) 當你的功能代碼結束,你想要的SSJS代碼踢。通過ID 並點擊查找按鈕()on button through javascriptList item
  2. 將所有內容移至SSJS,如果文檔已修改,則使用自定義驗證程序向用戶返回錯誤消息 或在您的代碼中檢查修改後的值並將值添加到作用域 變量在計算字段中顯示。
+0

您能詳細說明一下嗎? 你的答案?我從服務器返回一些東西(如果文檔被修改則返回true,如果文檔沒有被修改則返回false)。我不能使用onComplete,因爲我的代碼也在SSJS事件上,這就是爲什麼我想要停止任何代碼執行,如果addCallback返回true。 onComplete事件將在執行CSJS和SSJS代碼後觸發。 – PSolano 2013-02-19 15:21:25

+0

感謝@Fredrik的建議;這兩個都是很棒的點子但是,我想在客戶端級別的不同操作或按鈕中重用此代碼,這就是我試圖使用RPC控件的原因。 – PSolano 2013-02-20 12:34:16

相關問題