2013-02-19 30 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

相关问题