Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xpages 有没有办法让jsonRpcService同步工作?_Xpages_Xpages Extlib - Fatal编程技术网

Xpages 有没有办法让jsonRpcService同步工作?

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

我有一个简单的jsonRpcService,它有一个返回true或false的方法

我在CCJS和SSJS事件中有一个带有代码的按钮。若RPC返回true,我想停止代码执行,但看起来代码是在addCallBack完成之前触发的,并且代码在SSJS或正在执行

在继续任何其他CCSJ指令或SSJS代码之前,是否有任何方法等待addCallBack响应。我希望返回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个警报,以便您可以查看它们的执行顺序。

您不应该在webbrowser中编写阻止代码,因为如果您这样做,浏览器将显示为挂起。这就是为什么要使用回调函数,如果需要从服务器检索某些内容,请继续在那里编写代码

您还可以在刷新完成后触发onComplete事件

===================================================== 编辑

这是我解决问题的两种方法

  • 客户端使用回调函数将SSJS代码移动到隐藏按钮(使用CSS) 当您的函数代码结束并且希望SSJS代码生效时。按ID查找按钮 并通过javascriptList项单击按钮()
  • 将所有内容移动到SSJS,如果文档被修改,则向用户返回一条错误消息 使用自定义验证器或在代码中检查已修改的内容,并向作用域添加值 显示在计算字段中的变量

  • 在按钮中,添加以下行以获得对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。