6

使用此代码,我可以在服务器脚本运行时显示动画 gif:

function calculateTotals() {
    $('#results').load('getResults.php', null, showStatusFinished);
    showLoadStatus();
}

function showLoadStatus() {
    $('#status').html('');
}


function showStatusFinished() {
    $('#status').html('Finished.');
}

但是,我想显示脚本有多远的状态,例如“正在处理 20000 的第 342 行 ...”并让它计数直到完成。

我怎样才能做到这一点?我可以制作一个服务器脚本,它不断包含更新的信息,但是我在哪里放置命令来读取这个,比如说,每秒?

4

4 回答 4

2

阅读您对安德鲁回答的评论后。

你会读到这样的状态:

function getStatus() {
    $.getJSON("/status.php",{"session":0, "requestID":12345}, 
    function(data) { //data is the returned JSON object from the server {name:"value"}
          setStatus(data.status);
          window.setTimeout("getStatus()",intervalInMS)
    });
}

使用这种方法,您可以在服务器上同时打开多个 XHR 请求。

你所有的 status.php 输出是:

{"status":"We are done row 1040/45983459"}

但是,您可以在响应中输出尽可能多的信息并相应地处理它(例如提供进度条或执行动画..)

有关 $.getJSON 的更多信息,请参阅http://docs.jquery.com/Ajax/jQuery.getJSON

于 2008-10-03T06:11:10.200 回答
1

我对 jQuery 的细节并不满意,但不涉及轮询的一般答案是:使用永久框架技术的变体。基本上,创建一个隐藏的 iframe,并将其 src 设置为“getresults.php”。在 getresults 中,您“流式传输”返回脚本块,这些脚本块是对父文档中的 javascrpt 函数的调用,该函数实际上更新了进度。这是一个示例,显示了永久框架背后的基本思想。(不过我不建议使用他的实际 JS 或 HTML,这是相当平均的)

于 2008-09-16T12:31:11.213 回答
0

您的服务器端脚本应该以某种方式将其进度保持在服务器上的某个位置(文件、数据库中的字段、memcached 等)。

您应该有 AJAX 函数返回当前进度。每秒轮询一次此函数并相应地呈现结果。

于 2008-09-16T12:19:17.670 回答
0

在不知道您的服务器端代码如何工作的情况下很难说。但是,该过程分为三个阶段。首先,您需要调用一个工作创建脚本。这将返回一个 ID 号并设置服务器工作。接下来,每隔一秒左右,您需要调用一个状态脚本,该脚本返回您要显示的状态消息。该状态脚本还需要返回一个值,指示作业是否已完成。当状态脚本显示作业已完成时,您将停止轮询。

如何获取此状态脚本是了解作业的状态很大程度上取决于服务器的设置方式,但可能涉及在作业期间的各个时间点将消息写入数据库表。然后状态脚本从数据库中读取此消息。

于 2008-09-16T12:22:33.513 回答