我正在开发的应用程序主页上有一个仪表板。为了避免负载问题,仪表板的内容将通过Ajax异步计算,允许用户不要等待它准备好转到另一个页面,或等待慢速组件检查打火机上的指示灯的。
它应该像这样工作:
通常情况下,我可以随时点击一个链接转到另一个页面,看看这些调用是如何异步的,所以我作为用户保持控制。组件也会尽快更新,因为每个Ajax调用也是异步的。 但是,每当我单击一个链接时,它会在处理之前等待调用结束并转到新页面,迫使用户等待(有时很长)加载。 "刷新"调用也是按顺序处理的,而不是同时处理的。
我如何获得"真实"异步?起初我读到Ajax默认是异步的,但你可以指定" asynchronous:true",我试过它,它没有改变任何东西。 对于它的价值,我们大多使用IE7(" quirks模式" IE8,因为我们得到应用程序的人忽略了使用doctype和编码,包括一个使得应用程序无法使用)。 这是代码:
function create_dashboard() {
var param = [...];
options = {
method: 'post',
postBody: param,
asynchronous: true,
evalJS: true,
onSuccess: function(return) {
setTimeout(function(){tallyRefreshes()}, 100);
setTimeout(function(){[switch a css class on some wrapper]}, 100);
}
};
new Ajax.Updater('cadre_tdb','../php/dashboard/ajax/dashboard_manager.ajax.php', options);
}
function tallyRefreshes() {
// for each component to refresh, gather its information
elems = document.getElementsByClassName('dash_refresh_info');
for (var i = 0; i < elems.length; i++) {
wrapper = elems[i].getElementsByClassName('dash_refresh_info_wrapper')[0].value;
component_class = elems[i].getElementsByClassName('dash_refresh_info_class')[0].value;
delay = elems[i].getElementsByClassName('dash_refresh_info_delay')[0].value;
// send the info to a function which will trigger content refreshes at regular intervals
refreshComponent(wrapper, component_class);
if (delay > 0) {
createRefreshTimer(wrapper, component_class, delay);
}
}
}
function refreshComponent(id_wrapper, component_class) {
var wrapper = document.getElementById(id_wrapper);
wrapper.innerHTML = '<div class="dashboard_loading"> </div><span>Please wait, loading component...</span>';
var param = [...];
options = {
method: 'post', postBody: param, asynchronous: true, evalJS: true };
new Ajax.Updater(id_wrapper,'../php/dashboard/ajax/dashboard_manager.ajax.php', options);
}
组件只能一个接一个地刷新(通过refreshComponent()),而不是同时刷新,直到它们全部完成,用户无法控制,无法通过点击链接来更改页面。 如何使真正异步?
提前致谢。
答案 0 :(得分:0)
更新(现已解决)问题:虽然它并非来自服务器,但它确实是一个顺序问题。 Ajax调用使用了PHP会话,我了解到它是用文件管理的,这意味着会话已被锁定&#34;如果已经以书面形式访问了另一个页面,则无法访问该页面。
因为我只使用它作为当前用户配置文件的缓存(检查它,如果它被定义得到它,如果没有定义它并得到它),我在最后一个之后添加了session_write_close()写访问权限,以及#34;释放&#34;会议。这使得我的所有电话都可以同时发生#34;同时&#34;因为它们可以在会话使用后开始(在开始时短和右)而不是等待整个脚本(对于某些组件最多执行5次),并且我可以单击指向其他页面的链接(这也需要会话)并且看起来没有任何延迟。 感谢您提供的服务器建议,即使它不是问题,它也让我走上了轨道!