0

我有一个简单的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 个警报,因此您可以看到它们正在执行的顺序。

4

2 回答 2

1

您永远不应该在网络浏览器中编写阻塞代码,因为如果您这样做,浏览器就会出现挂起。这就是为什么你有回调函数,如果你需要从服务器检索某些东西,请继续在那里编写代码。

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

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

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

  1. 客户端使用回调函数将 SSJS 代码移至隐藏按钮(使用 CSS)
  2. 将所有内容移动到 SSJS,如果文档被修改,则使用自定义验证器或在您的代码中检查是否修改并向用户返回错误消息,并将值添加到显示在计算字段中的范围变量中。
于 2013-02-19T14:54:28.190 回答
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 支持的对象属性

现在您可以调用您的 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(它已同步)。

于 2013-02-19T21:18:08.370 回答