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

javascript calling DataSnap REST makes browser unresponsive

我用的是Delphi XE7。当我的 Javascript 调用需要大约 800 毫秒来读取传感器和 return 数据的服务器函数时,从我单击按钮调用 Javascript 直到它最终响应 return秒。我正在使用代理变量 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 执行,直到响应返回并可变接收值?

我考虑尝试使用 jQuery Ajax 调用 URL,但还有其他解决方案吗?

因为 serverMethods 是从代理生成的,但是对于 $ajax 我需要手动设置它们中的每一个。或者也许我在这里做错了什么,可以在不阻塞的情况下使用 serverMethods?

谢谢。

我研究了在 serverMethods().SOMEAPIFUNCTION() 上调用的 ServerFunctionExecutor.js 中的执行路径后找到了解决此问题的方法 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 个参数是回调:

此示例代码现在如下所示:

 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 是所有者 usuali undefined