我使用的是Delphi XE7。当我的Javascript调用我需要大约800ms的服务器功能来读取传感器并返回数据时,从我点击按钮调用Javascript直到最终响应返回时,浏览器没有响应。我正在使用代理var serverMethods().getChannel(i);
生成的默认Javascript来调用我的服务器函数。
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可以不受阻塞地使用?
感谢。
答案 0 :(得分: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代码中定义了Server方法,例如js中的3个参数,则第4个参数是回调:
对于此示例代码,现在看起来像这样:
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);
});
a是JSON响应
b是请求状态为200或其他
c是所有者通常未定义