Javascript 如何针对由于后台多个异步请求而导致的延迟优化基于web的应用程序?

Javascript 如何针对由于后台多个异步请求而导致的延迟优化基于web的应用程序?,javascript,ajax,optimization,ria,Javascript,Ajax,Optimization,Ria,我正在设计一个基于瘦服务器客户端MVC架构的模块化RIA。目前,应用程序只完成了10%,因此,纳入设计变更还不算太晚 应用程序的设计方式是,它最初以非常小的占用空间加载,并且根据用户执行的操作,异步获取大量数据。这些数据可能包括存储在我的服务器中的数据以及来自第三方web服务(包括社交网络和微博服务)的数据 然而,我担心的是,在后台运行的多个数据密集型ajax请求是否可能会使浏览器停止运行?我最近在一些社交内容聚合服务中发现了一些严重的延迟问题,在分析客户端代码时,我惊讶地发现客户端的应用程序占

我正在设计一个基于瘦服务器客户端MVC架构的模块化RIA。目前,应用程序只完成了10%,因此,纳入设计变更还不算太晚

应用程序的设计方式是,它最初以非常小的占用空间加载,并且根据用户执行的操作,异步获取大量数据。这些数据可能包括存储在我的服务器中的数据以及来自第三方web服务(包括社交网络和微博服务)的数据

然而,我担心的是,在后台运行的多个数据密集型ajax请求是否可能会使浏览器停止运行?我最近在一些社交内容聚合服务中发现了一些严重的延迟问题,在分析客户端代码时,我惊讶地发现客户端的应用程序占用空间非常小,在300KB以内。但是,在运行应用程序时,浏览器(Firefox和IE)经常挂起,需要几秒钟才能恢复。在分析这些非同步请求后,该应用程序似乎同时从gmail、facebook和twitter获取用户内容,并将其推入DOM,占用了太多的内存资源

如果有人能为我指出一些预防此类问题的指导方针/最佳做法,那就太好了。建议编写一个自定义包装器脚本,按照预先指定的重要性顺序顺序在后台加载内容,而不是并行加载所有内容,这可能最终导致并行执行多个回调


任何建议都将不胜感激

由于Facebook/LinkedId/etc插件,我的页面加载也有延迟

我的解决方案是异步加载第三方JavaScript。 它并不适用于每一个web服务/小部件,而是适用于其中的许多服务/小部件(Facebook“Like”按钮、Twitter“tweet”按钮等)

例如:

<div id="tweet">
    <a href="http://twitter.com/share" 
        class="twitter-share-button" 
        data-count="horizontal"
    >Tweet</a>
</div>
<script type="text/javascript">
    $(function() {
        $.getScript('http://platform.twitter.com/widgets.js');
    });
</script>

$(函数(){
$.getScript('http://platform.twitter.com/widgets.js');
});
此代码将在加载页面(DOM)后呈现“Tweet”按钮


但您应该首先检查所请求的web服务的JavaScript是否使用document.write()。如果是这样-您在这里什么也做不了,只有同步加载是可能的。

一个解决方案,这并不是所有情况下的杀手级解决方案,但一个解决方案是在服务器端委派内容聚合,而不是在最终的浏览器中委派

这可以通过ESIGates实现。其中一个是,但它不能涵盖全部。也是开源的,可能覆盖范围更广(尚未测试)。ESI系统意味着您的应用程序布局可以是具有不同缓存策略(TTL)的各种块和不同提供程序的组合。ESI服务器将承担您最初发送到最终浏览器的一部分流量,因此将花费您更多的带宽,但至少与HTTP客户端使用的不同浏览器相比,您将在这一软件上获得更多的控制

至少它可以改进服务器上异步数据加载的缓存策略,这样可以加快最终浏览器的响应时间(更好的响应时间,更少的并行工作)

现在在brwoser方面,根据页面上的优先级,您当然应该确定什么是最重要的内容,用户可以开始使用的内容,以及什么只是一个“装饰”(好吧,这意味着你的服务具有良好的信息/噪音比,如果你的网站除了社交网络聚合之外什么都不提供,你就会遇到问题)

我假设您的应用程序是一个包含大量异步加载数据的小型静态应用程序,因此您使用了大量ajax,并且没有太多页面更改。这意味着一旦加载内容,它将在页面中驻留很长时间

因此,让社交网络和其他web服务内容延迟链接,而不是大量并行负载应该不是问题。也许在前15秒它不会出现,但如果它在页面上停留15分钟,那么这可能不是问题(如果最重要的内容已经存在,用户可能甚至不会注意到装饰性内容不可用)。这里有一个IE6(有时是IE7)提示,在任何地方使用
setTimeout()
js命令强制重新绘制页面,你会看到可用内容显示得更快


最后一个提示,如果你需要对更新的内容进行一些定期的ajax检查。如果你真的每分钟对10个内容进行这些检查,你总是会遇到并行加载问题和一个大的活动,与初始加载时的问题相同,通常你可以使用两种方法来解决这个问题,一种是COMET家庭长期运行的HTTP connexions(因此您可以推送数据和/或获得更快的响应,但只有在您的服务器针对这种HTTP流量进行了调优的情况下)。第二个是为下一次检查添加一个时间因素,这样第一次检查在1分钟后进行,下一次检查在2分钟后进行,然后是3、15、25等,最后可能每小时才进行一次新检查。当您检测到来自用户的某些活动(某些用户交互)时,您可以减少下一次检查的延迟。这是因为您可以假设用户只有在对您的页面进行处理时才真正在寻找新数据。这样可以节省一些用户CPU,还可以帮助服务器加载。

谢谢您的精彩回答。内容优先级是我已经在做的事情,我一直在研究COMET technolo并评估是否值得投资。但是,你的提示