我在我的Web应用程序中使用JSF 2.2,PrimeFaces 6和Spring Framework 4.3。
用户登录后,用户将重定向到主页。在主页中,有一些图表,表等。他们显示了一些实时信息,并且需要一些时间来加载主页。我不希望用户在登录页面中等待时间太长。因此,我使用以下代码来加载页面加载,如下所述:
<h:form id="hiddenForm" style="display: none;">
<p:remoteCommand name="onload" actionListener="#{homeMB.onload}"
update=":firstChartForm :secondChartForm :thirdChartForm" global="false"/>
</h:form>
这是备份bean的on载方法:
public void onload() {
fillFirstChart(); //Takes 5 seconds
fillSecondChart(); //Takes 1 second
fillThirdChart(); // Takes 3 seconds.
}
图表由这些方法填充,并借助于p:remoteCommand
的update
参数进行更新,但需要9秒。我想同时运行这些方法,并在加载数据后立即将这些图表与相应方法提供的数据更新。
我的意思是,用户在单击登录按钮时应立即将用户重定向到主页,并且在主页上首先应在1秒内填充/更新第二秒钟,然后在2秒钟内填充/更新2秒,最后2秒钟2秒后来的FirstChart应填写/更新。因此总共需要5秒钟。
编辑:这个答案对我不起作用,因为当我异步加载图表时,JSF会等待最慢的图表以更新所有图表。好的,这需要5秒,而不是总共9秒,但是正如我所说:"在首页中,第二秒钟应该在1秒内填充/更新,然后在2秒钟后进行第三次填充/更新,最后2秒钟后,FirstChart应该填充/更新"。但是,如果我应用第一个答案中描述的方式,则它们都在5秒内更新
可以应用此答案。我的意思是,一旦用户单击登录按钮,服务器就可以收集并将数据推到图表上,并且可以通过RequestContext.getCurrentInstance().update("foo:bar");
从BAND BEAN进行更新,如下所示。但是我认为这可能会有一些简单的方法,因为我认为许多人以前可能面临类似的问题。
谢谢。
不要按照用户的要求进行太多的繁重举重,阻止UI ...至少没有启动异步AJAX调用。将远程命令与async="true"
(在p:remoteCommand
上(使用,并将用户告知正在发生的事情(例如使用p:poll
(,并添加某种形式的缓存。或者,取订单,让计划的作业在后台处理订单,并在完成后向用户报告。
另请参见:
- 使用计时器的JSF托管Bean中的产卵线程
- 如何在JavaScript中创建异步功能?
- jQuery异步函数调用,否ajax请求