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

时间:2015-06-20 14:24:22

标签: javascript rest delphi delphi-xe7 datasnap

我使用的是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可以不受阻塞地使用?

感谢。

1 个答案:

答案 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是所有者通常未定义