Xpages 有没有办法让jsonRpcService同步工作?
我有一个简单的jsonRpcService,它有一个返回true或false的方法 我在CCJS和SSJS事件中有一个带有代码的按钮。若RPC返回true,我想停止代码执行,但看起来代码是在addCallBack完成之前触发的,并且代码在SSJS或正在执行 在继续任何其他CCSJ指令或SSJS代码之前,是否有任何方法等待addCallBack响应。我希望返回false将停止任何代码执行 这是我的代码:Xpages 有没有办法让jsonRpcService同步工作?,xpages,xpages-extlib,Xpages,Xpages Extlib,我有一个简单的jsonRpcService,它有一个返回true或false的方法 我在CCJS和SSJS事件中有一个带有代码的按钮。若RPC返回true,我想停止代码执行,但看起来代码是在addCallBack完成之前触发的,并且代码在SSJS或正在执行 在继续任何其他CCSJ指令或SSJS代码之前,是否有任何方法等待addCallBack响应。我希望返回false将停止任何代码执行 这是我的代码: var lastupdate = '#{javascript:document1.getDoc
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个警报,以便您可以查看它们的执行顺序。您不应该在webbrowser中编写阻止代码,因为如果您这样做,浏览器将显示为挂起。这就是为什么要使用回调函数,如果需要从服务器检索某些内容,请继续在那里编写代码 您还可以在刷新完成后触发onComplete事件 ===================================================== 编辑 这是我解决问题的两种方法
在按钮中,添加以下行以获得对Dojo XHR请求的控制:
if( ! dojo._xhr )
dojo._xhr = dojo.xhr;
dojo.xhr = function ( args, ioArgs, addArgs ){
ioArgs["sync"] = true;
return dojo._xhr( args, ioArgs, addArgs );
}
这将强制所有调用同步(这将阻止浏览器、禁用超时等)。
请参见此处了解更多信息:
现在您可以调用您的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调用失败时会发生什么,但这可能会停止所有CSJ(已同步)。您能详细说明一下您的答案吗?我正在从服务器返回一些内容(若文档被修改,则返回true;若文档未被修改,则返回false)。我不能使用onComplete,因为我还有关于SSJS事件的代码,这就是为什么我想在addCallback返回true时停止任何代码执行。来自CSJS和SSJS的代码执行后将触发onComplete事件。感谢@Fredrik的建议;两者都是好主意。但是,我希望在客户端级别的不同操作或按钮中重用此代码,这就是我尝试使用RPC控件的原因。只需在addCallBack函数中移动回调后应执行的代码。我尝试了@SvenHasselbach。我在addCallback中添加了一个else语句:
myobject.addCallback(函数(modified){alert(modified);//#2 if(modified){alert(“此文档已被修改”);//#3 return false;}else{validateForm();})代码>问题是我的按钮在SSJS上也有代码;因此,无论addCallback的结果如何,这都会被触发。如果RCP方法返回trueSo,我想停止任何代码执行。因此,如果我正确地读取了它,则事件的客户端部分将触发服务器代码,以确定事件的服务器部分是否应运行。为什么不将该逻辑移到事件的服务器部分,以便所有服务器代码都从一个入口点运行?这很好@Sven RPC现在已同步;然而,返回false只是从addCallback及其在SSJS上执行的代码中退出。我必须在if语句中分配一个变量result,然后在addCallback之后检查它的值:if(modified){alert(“此文档已被修改”);//#2 result=false;return false;alert(“不应显示此内容”);//#?}
知道如何停止代码执行吗?是的,在按钮中创建一个变量:var ret=true;然后根据需要更改回调函数中的变量值(ret=false)。CSJS中的最后一行代码返回ret。