UI 在 AJAX 调用期间无响应
UI unresponsive during AJAX calls
我有一个仪表板屏幕,需要在加载时发出大约 20 个 AJAX 请求,每个请求返回不同的统计信息。总共需要大约 10 秒才能返回所有请求。但是,在这 10 秒内,UI 几乎被锁定。
我记得读过 Nick Zakas 的 JS 书,其中描述了在密集操作(使用计时器)期间保持 UI 响应能力的技术。我想知道是否有类似的技术来处理我的情况?
*出于多种原因,我试图避免合并 AJAX 调用
$(".report").each(function(){
var container = $(this)
var stat = $(this).attr('id')
var cache = db.getItem(stat)
if(cache != null && cacheOn)
{
container.find(".value").html(cache)
}
else
{
$.ajax({
url: "/admin/" + stat,
cache: false,
success: function(value){
container.find(".value").html(value.stat)
db.setItem(stat, value.stat);
db.setItem("lastUpdate", new Date().getTime())
}
});
}
})
如果您有权访问 jQuery,则可以利用 $.Deferred
对象同时进行多个异步调用,并在它们全部解析时执行回调。
http://api.jquery.com/category/deferred-object/
http://api.jquery.com/deferred.promise/
如果这些回调中的每一个都对 DOM 进行了修改,则应将更改存储在某个临时位置(例如内存中的 DOM 对象),然后一次将它们全部追加。DOM 操作调用非常耗时。
我在大量使用 SharePoint Web 服务时遇到过类似的问题 - 您通常需要从多个源中提取数据才能为单个进程生成输入。
为了解决这个问题,我将这种功能嵌入到我的 AJAX 抽象库中。您可以轻松定义一个请求,该请求将在完成后触发一组处理程序。但是,每个请求都可以使用多个 http 调用来定义。下面是组件(和详细文档):
DPAJAX at DepressedPress.com
这个简单的示例创建一个具有三个调用的请求,然后按调用顺序将该信息传递给单个处理程序:
// The handler function
function AddUp(Nums) { alert(Nums[1] + Nums[2] + Nums[3]) };
// Create the pool
myPool = DP_AJAX.createPool();
// Create the request
myRequest = DP_AJAX.createRequest(AddUp);
// Add the calls to the request
myRequest.addCall("GET", "http://www.mysite.com/Add.htm", [5,10]);
myRequest.addCall("GET", "http://www.mysite.com/Add.htm", [4,6]);
myRequest.addCall("GET", "http://www.mysite.com/Add.htm", [7,13]);
// Add the request to the pool
myPool.addRequest(myRequest);
请注意,与提供的许多其他解决方案不同,此方法不会强制对正在进行的调用进行单线程处理 - 每个调用仍将在环境允许的范围内以最快(或缓慢)的速度运行,但只有在所有调用都完成后才会调用单个处理程序。它还支持设置超时值,如果您的服务有点不稳定,则重试尝试。
在您的情况下,您可以发出单个请求(或分组相关请求 - 例如快速的"最需要"请求和运行时间较长的"很高兴拥有"请求)来调用所有数据并在完成时同时显示所有数据(如果有多个请求,则以块为单位)。 您还可以专门设置要使用的后台对象/线程的数量,这可能有助于解决性能问题。
我发现它非常有用(从代码的角度来看,理解起来非常简单)。 不再需要链接,不再需要计数调用和保存输出。 只是"设置并忘记它"。
哦 - 关于您的锁定 - 您是否有机会在本地开发平台上对此进行测试(针对与浏览器在同一台计算机上的服务器运行请求)? 如果是这样,可能只是机器本身正在处理您的请求,而根本不表示实际的浏览器问题。
- Ajax调用在Firefox中不会自动响应
- 在Javascript中的ajax响应之后未调用Dropdown事件
- 调用Ajax并返回响应
- 如何放置单独的ajax调用,使页面的一部分完全响应,而另一部分仍在加载
- 在JavaScriptAjax调用中从web服务中的XMLDocument获取响应.
- 使用嵌套AJAX调用的响应填充数组
- 在SPRING中从ajax调用响应时显示不可接受错误
- 如果从onclick()内部调用app.open,则它没有响应
- 通过 AJAX 调用 PHP 文件,将 $_GET 变量传递到 MySQL 查询中,然后回显到响应中
- AJAX 调用在获得响应并成功执行时会冻结浏览器一段时间
- 如何在 http 上调用 end().服务器响应对象
- 所需响应的主干无限集合获取调用
- 从Javascript调用php代码-AJAX响应整个页面's html
- 解码Ajax调用中的Json响应
- 如何根据响应调用change-ajaxurl
- 从 iframe 中的 HTML 表单响应调用父页面
- 从已弃用的响应调用更新不起作用
- 如何从Ajax响应调用中获取目标页面上的数据参数
- 如何调用$http在angularJS顺序?但是我需要根据第一个$http的响应调用它第二个$http
- 从ajax post响应调用函数