javascript调用DataSnap REST使浏览器无响应
我使用delphixe7。当我的Javascript调用我的服务器函数(读取传感器和返回数据大约需要800毫秒)时,从我单击按钮调用Javascript的那一刻起,浏览器就没有响应,直到它最终返回响应为止。我正在使用代理varjavascript调用DataSnap REST使浏览器无响应,javascript,rest,delphi,delphi-xe7,datasnap,Javascript,Rest,Delphi,Delphi Xe7,Datasnap,我使用delphixe7。当我的Javascript调用我的服务器函数(读取传感器和返回数据大约需要800毫秒)时,从我单击按钮调用Javascript的那一刻起,浏览器就没有响应,直到它最终返回响应为止。我正在使用代理varserverMethods().getChannel(I)生成的默认Javascript调用我的服务器函数 Javascript调用如下所示: var s = serverMethods().getChannel(i); serial[i].$sensorlVa
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);
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);
});
所以,默认情况下,并没有Javascript回调或承诺,所以embaracaderom会设法阻止Javascript执行,直到响应返回并接收变量值为止
我想尝试在URL上使用jQueryAjax调用,但还有其他解决方案吗
因为serverMethods是从proxy生成的,但是对于$ajax,我需要手动设置它们。或者我在这里做错了什么,服务器方法可以在没有阻塞的情况下使用
谢谢。在研究ServerFunctionExecutor.js中的执行路径后,我找到了这个问题的解决方案,该路径在serverMethods()上调用。SOMEAPIFUNCTION()上
1.帮助和文档为0,google+XE7问题为0。因此,如果有人从embaracadero阅读此文件,请制作适当的文档
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个参数,则第4个参数是回调:
对于此示例,代码如下所示:
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);
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响应
b是编号为200或其他的请求状态
c是所有者通常未定义的别傻了,我知道这是浏览器端的JS问题,它的所有内容都与delphi服务器有关,因为它生成客户端JS,并且它使用类似的示例生成,所以它的所有内容都与delphi有关,因为它们可以从thay proxygenerator中给出这段代码。