【问题标题】:Show a progress bar or block the UI till the file is generated server side显示进度条或阻止 UI 直到文件在服务器端生成
【发布时间】:2013-07-07 16:12:33
【问题描述】:

我正在对从 MS SQL 服务器数据库中提取的一些数据进行强制定向布局(使用 d3.js http://bl.ocks.org/mbostock/raw/4062045/)。目前我正在使用 python 脚本生成 json 文件,然后使用 python -m SimpleHTTPServer 在本地服务器上运行它。

我想要做的是在我的 python 脚本和 HTML 之间创建一个链接,这样当我输入网址时,python 脚本应该在服务器端运行并生成 json 文件。在此期间,我需要阻止 UI。生成文件后,图形应显示在屏幕上。我可以分别生成图形和 json 文件。需要将它们与 blockui 或进度条放在一起(我认为进度条会太多)。

我是 javascript 和 web 开发的菜鸟,在创建我的图表时有点学习。对此方向的任何指导将不胜感激。

谢谢,

普拉提克

编辑:

目前的sn-p代码如下:

d3.json("json_data.json", function(error, graph) 
{

  var nodeMap = {};
  graph.nodes.forEach(function(x) { nodeMap[x.name] = x; });
  graph.links = graph.links.map(
  function(x) 
  {
    return {
        source: nodeMap[x.source],
        target: nodeMap[x.target],
        value: x.value
        };
  });

  force
       .nodes(graph.nodes)
      .links(graph.links)
      .start();

我将把这段代码放在 ajax 请求的成功部分下。我希望脚本发送 ajax 请求一分钟,以查看服务器上是否存在 json_data.json 文件,并在创建文件时显示纺车,如果时间用完,则控制转移到错误请求部分。

json文件简单如下:

nodes: {}
links: {} //without any children level of depth.

【问题讨论】:

  • 你不可能有一个真正的进度条(除非你做了一堆不值得的额外工作)。你可以只用一个纺车之类的东西吗?
  • 是的。这就是为什么我说进度条的工作量太大了。纺车会很好。我可以阻止 UI 的任何体面的东西。
  • 您可能需要重新考虑您的方法。阻止用户界面不是通常是一件好事。
  • malsup.com/jquery/block/#page。这就是我对 blockUI 的意思。由于我从 MS SQL Server 数据库中提取的数据非常庞大(超过 50K 行),因此我不希望用户在代码呈现图形时单击页面上的其他任何位置。你能详细说明为什么这不是一件好事吗?

标签: javascript jquery ajax d3.js


【解决方案1】:

如果您使用的是 jQuery,请查看 http://api.jquery.com/jQuery.ajax/ 以了解如何创建您的 ajax 请求。您可能希望将请求放在页面的 $(document).ready() 函数的开头。然后,您可以使用blockUI,如您所述,在开始 ajax 调用之前阻塞页面,然后在您在 ajax 调用中定义的成功和错误(或完成)回调中解除阻塞。类似于以下内容:

$(document).ready(function() {
    $('body').blockUI();
    $.ajax({
        url: http://www.example.com/pathYouAreListeningOn,
        data: {
            "dataYouNeedToSend" : "Here"
        },
        success: function(result, status, xhr) {
            $('body').unblockUI();
            // Whatever you need to do to display your graph
        },
        error: function(xhr,status,error) {
            $('body').unblockUI();
        }
     });
});

需要注意的是,如果您的 url 请求将是您所在页面的 url,您不需要包含它,并且如果您没有任何需要使用 ajax 发送的数据请求您也可以将其关闭。

【讨论】:

  • 感谢您的快速回复。在我的情况下,成功将被定义为在服务器端找到的 json 文件(这将是 python 脚本成功运行的结果)。但是我不知道如何将其包装在请求中。我让 epython 文件只进行处理,html 页面和 javascript 从 json 中提取数据并将其显示在浏览器上。所以理想情况下example.com/index.html 将永远存在。它是我要检查成功或错误的 data.json 文件。
  • 我不确定您将其包装在请求中是什么意思,您是指响应吗?如果您的脚本返回某些内容,将始终调用成功回调。只有在 ajax 调用出现问题时才会调用错误回调。您可能想在此问题的答案中查看 json 结果是如何形成的:stackoverflow.com/questions/10721244/ajax-posting-to-python-cgi 注意 python 的结果如何包含成功和消息,您可能想做类似的事情。
  • 谢谢 Jahorse。这正是我想要的。
猜你喜欢
  • 1970-01-01
  • 2011-03-02
  • 2012-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多