如何同时加载/更新JSF/PrimeFaces组件



我在我的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:remoteCommandupdate参数进行更新,但需要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请求

最新更新