【问题标题】:javascript calling DataSnap REST makes browser unresponsivejavascript 调用 DataSnap REST 使浏览器无响应
【发布时间】:2015-06-20 14:24:22
【问题描述】:

我使用 Delphi XE7。当我的 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);

所以默认情况下没有 Javascript 回调或承诺,所以 embaracaderom 设法阻止 Javascript 执行,直到响应返回并变量 a 接收值?

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

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

谢谢。

【问题讨论】:

  • 别傻了,我知道这是浏览器端的 JS 问题,它与 delphi 服务器有任何关系,因为它生成客户端 JS,并且它用像这样工作的示例生成它,所以它拥有delphi的一切,因为他们从代理生成器中提供了这段代码。

标签: javascript rest delphi delphi-xe7 datasnap


【解决方案1】:

在研究了在 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 是所有者通常未定义

【讨论】:

    猜你喜欢
    • 2017-08-07
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多