8

我有一个 ajax 调用正在获取一个大的 json 列表。有什么办法可以制作一个进度条来获取 json 加载的实际值(例如,状态栏显示 200 个加载中的 1 个)?

现在我有一个非常基本的 Ajax 调用

function SendAjax(urlMethod, jsonData, returnFunction) {
    $.ajax({
        type: "GET",
        contentType: "application/json; charset=utf-8",
        url: urlMethod,
        data: jsonData,
        dataType: "json",
        success: function (msg) {
            if (msg != null) {
                ReturnJson(msg);
            }
        },
        error: function (xhr, status, error) {
            // Boil the ASP.NET AJAX error down to JSON.

            var err = eval("(" + xhr.responseText + ")");

            // Display the specific error raised by the server
            alert(err.Message);
        }
    });
}
4

3 回答 3

2

尝试在您的应用程序全局范围内使用AjaxStart 。这意味着您可以将代码放在布局文件中,如果处理时间很长,它将显示进度指示器...

$(document).ajaxStart(function() {
   $( "#loading" ).show();
 });

您可以使用百分比 - javascript/jquery在预加载时查看示例和答案。

于 2013-05-21T05:01:55.030 回答
1

ajax 请求中有几个状态,但它们不代表请求中的任何百分比。

网络流量应该是您真正的问题,您不想发送 200 个单独的请求(尽管这将允许一个进度条,但它会使整个请求花费更长的时间,具体取决于您与服务器的网络连接)。

您最好只显示一个活动指示器并在请求完成时将其删除,并尝试优化您的代码服务器端以尽快返回 200 个项目。

如果 200 项确实太大(大于 X 秒而无法返回),您可以将其分成两半或四等分以显示一些进度,但这会浪费时间处理网络、页眉等上的额外请求。

于 2013-05-21T04:11:28.697 回答
0

如果您的服务器端代码具有共享应用程序状态的方式(例如 PHP 中的 $_SESSION),您可以发出 2 个单独的请求,一个请求数据,一个检查第一个请求的进度。在计时器上重复第二个请求,直到第一个请求完成,并在处理每个项目时更新 $_SESSION (或在您的服务器代码中起作用的任何内容)。

例如:初始页面必须启动一个会话,以便后续的 AJAX 调用拥有 cookie,并且可以访问共享数据:

<?php
session_start();
session_write_close(); // close the session so other scripts can access the file (doesn't end the session)
// your page content here
?>

首先 AJAX 调用开始处理:

<?php
function updateSession($count){
    session_start(); // open the session file
    $_SESSION['progress'] = $count;
    session_write_close(); // let other requests access the session
}
// as you process each item, call the above function, ex:
for ($i = 1; $i <= 10; $i++) {
    updateSession($i);
}
?>

第二个 AJAX 调用(每 X 秒重复一次)如下所示:

<?php
session_start(); // open the session file
echo @$_SESSION['progress'] or 0; // echo contents or 0 if not defined
session_write_close(); // let other requests access the session
?>

抱歉,我不了解 ASP.NET,但希望上面的代码对您有用。

于 2013-10-04T00:01:47.083 回答