2015-06-20 78 views
2

我使用Delphi XE7。當我的Javascript調用需要大約800ms的服務器函數來讀取傳感器並返回數據時,從我點擊按鈕調用Javascript直到最終響應返回的那一刻起,瀏覽器就沒有響應。我使用由代理var serverMethods().getChannel(i);生成的默認JavaScript來調用我的服務器功能。JavaScript調用DataSnap REST使瀏覽器無響應

JavaScript調用這個樣子的:

var s = serverMethods().getChannel(i); 
     serial[i].$sensorlValue.text(s.result.fields.sensorString); 
     serial[i].$sensorlRealValue.text(s.result.fields.sensor); 
     serial[i].$sensorStatus.text(s.result.fields.sensorStatus+' '+s.result.fields.name); 
     serial[i].$sensorError.text(s.result.fields.sensorError); 
     serial[i].$AVString.text(s.result.fields.AVString); 
     serial[i].$AVError.text(s.result.fields.AVError); 

所以默認情況下比如有沒有使用Javascript回調或承諾,所以embaracaderom管理莫名其妙地從執行阻止JavaScript直到響應回來和可變接收值?

我想嘗試在URL上使用jQuery Ajax調用,但有沒有其他解決方案?

因爲serverMethods是從代理生成的,但對於$ ajax我需要手動設置它們中的每一個。或者,也許我在這裏做錯了什麼,serverMethods可以使用而不會阻塞?

謝謝。

+2

不要成爲smartass,我知道這是瀏覽器端的JS問題,並且它與delphi服務器一直在運行,因爲它生成了客戶端JS,並且它使用像這樣工作的示例生成它,所以它與delphi一起運行,因爲這個代碼來自這個代理生成器。 –

回答

3

我找到了解決這個問題的研究被稱爲上serverMethods()在ServerFunctionExecutor.js執行路徑之後。SOMEAPIFUNCTION() 1.幫助和文檔是0,和谷歌+ XE7問題是0.因此,如果有人來自embaracadero閱讀這份PLS MAKE DECENT DOCUMENTATION。

ServerFunctionExecutor.js對管263

//async is only true if there is a callback that can be notified on completion 
var useCallback = (callback != null); 
request.open(requestType, url, useCallback); 

if (useCallback) 
{ 
    request.onreadystatechange = function() { 
    if (request.readyState == 4) 
    { 
     //the callback will be notified the execution finished even if there is no expected result 
     JSONResult = hasResult ? parseHTTPResponse(request) : null; 
     callback(JSONResult, request.status, owner); 
    } 
    }; 
} 

因此,它是更多鈔票,並沒有記錄使用回調疏通GUI。 使用它作爲:

serverMethods().SOMEAPIFUNCTION(par1,par2,.... callback) 

如果您已經在Delphi代碼中定義的與JS第四個參數例如3個參數服務器的方法是回調:

對於這個例子的代碼現在看起來是這樣:

serverMethods().getChannel(i,function(a,b,c){ 
      serial.$sensorlValue.text(a.result[0].fields.sensorString); 
      serial.$sensorlRealValue.text(a.result[0].fields.sensor); 
      serial.$sensorStatus.text(a.result[0].fields.sensorStatus+' '+s.result.fields.name); 
      serial[i].$sensorError.text(a.result[0].fields.sensorError); 
      serial[i].$AVString.text(a.result[0].fields.AVString); 
      serial[i].$AVError.text(a.result[0].fields.AVError); 
      }); 

一個是JSON REPONSE
b爲作爲數200或別的什麼其他
çRequest狀態是所有者usuali未定義