Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript调用DataSnap REST使浏览器无响应_Javascript_Rest_Delphi_Delphi Xe7_Datasnap - Fatal编程技术网

javascript调用DataSnap REST使浏览器无响应

javascript调用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

我使用delphixe7。当我的Javascript调用我的服务器函数(读取传感器和返回数据大约需要800毫秒)时,从我单击按钮调用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);
 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中给出这段代码。