2014-03-13 53 views
1

我正嘗試使用rpc服務更新文檔。在XPages中使用遠程服務(RPC)

我有一個xpage的按鈕。我想單擊該按鈕並使用CS javascript setInterval並每5秒更新一次文檔字段。

我使用的遠程業務控制和代碼是這樣的:

<xe:jsonRpcService id="jsonRpcService1" serviceName="heartBeat"> 
     <xe:this.methods> 
      <xe:remoteMethod name="send"> 





       <xe:this.script><![CDATA[var db = session.getCurrentDatabase(); 
var heartView = db.getView("Heartbeats"); 

var doc:NotesDocument = heartView.getFirstDocument(); 
var vl = doc.getItemValueString(); 
if(vl==""){ 
    doc.replaceItemValue("dummyH","z"); 
}else{ 
    doc.replaceItemValue("dummyH",vl+"z"); 
} 
doc.computeWithForm(false, false); 
doc.save();]]></xe:this.script> 
      </xe:remoteMethod> 
     </xe:this.methods></xe:jsonRpcService> 

按鈕的代碼是這樣的:

<xp:button value="Label" id="button1"> 
     <xp:eventHandler event="onclick" submit="false"> 
      <xp:this.script><![CDATA[setInterval(function(){heartBeat.send()},3000);]]></xp:this.script> 
     </xp:eventHandler></xp:button> 

它不工作。我沒有得到任何錯誤,但我也沒有得到文件中的更新......代碼中有什麼錯誤?

UPDATE

,如果我有一個簡單的print(「AAAAA」),它完美替代RPC腳本(我也跟着添在下面的答案的建議,爲我的客戶端代碼)。

當我再次使用我以前的代碼時,出現以下javascript錯誤: 無法加載/Databases/Test/Mike/my1.nsf/RPCpage.xsp/mm?$$viewid=!dqducrahog!狀態:400

如何從遠程服務訪問數據庫和文檔?

+1

什麼是你的問題和相關的問題? –

+0

對不起,我更新了這個問題。我看不到文檔中的更新......沒有錯誤或其他任何內容。 –

回答

9

RPC調用的語法稍有不同;例如,您撥打heartbeat.send()並不實際調用遠程send方法。相反,它返回的遠程方法描述符的句柄...實際調用遠程方法,你需要添加一個回調:

var remoteMethod = heartbeat.send(); 
remoteMethod.addCallback(function(response){ 
    // handle whatever came back from the server 
}); 

如果,例如,你設計你的遠程方法返回與否心跳是成功的,比較完整的例子是這樣的:

var heartbeatInterval = 3000; 
var periodicHeartbeat = function() { 
    var remoteMethod = heartbeat.send(); 
    remoteMethod.addCallback(function(response){ 
    if (response.stillAlive) { 
     setTimeout(periodicHeartbeat, heartbeatInterval); 
    } 
    }); 
} 
setTimeout(periodicHeartbeat, heartbeatInterval); 

它一般建議使用setTimeout最初計劃延期功能,然後從該遞延函數內再次調用setTimeout來安排自己的下一次執行,而不是使用setInterval

但是,在這種情況下,尤其如此,因爲每個遠程方法調用都是異步的,所以setInterval最終會導致請求重疊,因爲每次調用都需要至少幾個毫秒才能完成。

此外,從當前內部安排下一次執行的首選模式允許您檢查服務器發回的內容,以確定是否要繼續發送後續請求。現在你不會從遠程方法返回任何值;如果你只更改最後一行:

return { stillAlive: doc.save() }; 

...那麼JSON對象將被自動傳遞給你的回調函數的第一個參數。我們再看一下從前面的例子一行:

if (response.stillAlive) { 

...所以RPC調用只有重新安排本身,如果之前調用成功。這可能不是您想要的確切行爲,但考慮到您可以從遠程方法返回數據,並且將返回的數據傳遞給您的回調函數,您可以設計最適合您業務規範的調用和響應方法爲此功能。儘管如此,您可能需要查看XPages Extension Library中的keepAlive組件......它不會將心跳數據存儲在Domino文檔中,但如果您所要做的只是防止空閒會話過期,這是一個更簡單的解決方案。

+0

你是對的!但是,當我打開鉻檢查器,我看到這個錯誤: 無法加載/數據庫/測試/邁克/ my1.nsf/RPCpage.xsp/mm?$$viewid=!dqducrahog!狀態:400 你是否認爲我可以使用session.getCurrentDatabase()進入rpc服務代碼? –

+0

也在這個視頻http://notesin9.com/index.php/2011/08/25/notesin9-033-introduction-to-remote-services-in-xpages/ 我看到服務器端代碼去到腳本編輯器而不是計算值編輯器(在xpages中,第一個編輯器用於cs js,第二個編輯器用於ssjs)。我已經這樣做了。這是對的嗎? 沒有更多的問題:) Thnx –