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

时间:2013-02-19 11:59:45

标签: xpages xpages-extlib

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

我在CCJS和SSJS活动中有一个代码按钮。如果RPC返回true,我想停止代码执行,但是,看起来代码在addCallBack完成之前触发,代码在SSJS处执行或正在执行

在继续使用任何其他CCSJ指令或SSJS代码之前,有没有办法等待addCallBack响应。我期待return 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个提醒,以便您可以看到他们正在执行的顺序。

2 个答案:

答案 0 :(得分:1)

您永远不应该在Web浏览器中编写阻止代码,因为如果您将浏览器显示为挂起。这就是为什么你有回调函数,如果你需要从服务器检索一些东西,继续你在那里编码。

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

=============================================== ====== 修改

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

  1. 客户端使用回调函数将SSJS代码移动到隐藏按钮(使用CSS) 当您的功能代码结束并且您希望SSJS代码启动时。按ID查找按钮 并通过javascriptList项目
  2. 点击按钮
  3. 将所有内容移至SSJS,如果文档被修改,则会向用户返回错误消息 使用自定义验证器或在代码中检查是否已修改并向范围添加值 在计算字段中显示的变量。

答案 1 :(得分:1)

在Button中,添加以下行以控制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(它已同步)。