我有一个正在抓取大型json列表的ajax调用。有没有办法让我可以创建一个获得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);
}
});
}
答案 0 :(得分:2)
尝试在应用程序全局范围内使用AjaxStart。这意味着您可以将代码放在布局文件中,如果处理很长,它将显示进度指示器......
$(document).ajaxStart(function() {
$( "#loading" ).show();
});
您可以在preload with percentage - javascript/jquery看到示例和答案。
答案 1 :(得分:1)
ajax请求中有一些状态,但它们不代表请求中的任何百分比。
网络流量应该是您真正的问题,您不希望发送200个单独的请求(虽然这会允许进度条,但这会使整个请求花费更长的时间,具体取决于您与服务器的网络连接)。
最好只显示活动指示符并在请求完成时将其删除,并尝试优化代码服务器端以尽快返回200个项目。
如果200个项目确实太大(返回它们的时间超过X秒),您可以将其分成两半或四分之一以显示某些进度,但这会浪费时间在网络上的额外请求,页眉等
答案 2 :(得分: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,但希望上面的代码对您有用。