JSF/Primefaces AJAX请求是否真的异步?

Oli*_* J. 10 ajax jsf primefaces

我是JSF的新手所以我不知道我面临的行为是否正常.

我有这个代码:

<p:selectBooleanCheckbox id="locationChoice1" value="#{login.locationChoice1}">
    <p:ajax listener="#{login.chooseLocationType1}" update="locationChoice1 locationChoice2 positionChoice" />
    <p:ajax listener="#{login.retrieveGalaxies}" update="test"  />
</p:selectBooleanCheckbox>
Run Code Online (Sandbox Code Playgroud)

我的login.retrieveGalaxies函数调用sleep(8000)函数来模拟延迟.我期待我的组件locationChoice1,locationChoice2positionChoice在1或2秒内更新,我的test组件将在8秒内更新,但所有都在8秒内更新.

这是正确的行为吗?

我尝试使用async参数,但它没有改变结果.

Bal*_*usC 18

它们实际上是异步的(JS上下文没有被阻止;即你可​​以在同一时刻运行其他任意JS代码而不被阻止).你看到的行为是因为他们排队了.所以它看起来好像不是异步的.

这种排队行为在JSF 2规范的第13.3.2节中规定:

13.3.2 Ajax请求队列

所有Ajax请求必须在发送到服务器之前放入客户端请求队列,以确保按发送顺序处理Ajax请求.队列中等待时间最长的请求是下一个要发送的请求.发送请求后,Ajax请求回调函数必须从队列中删除请求(也称为出队).如果请求成功完成,则必须将其从队列中删除.如果出现错误,则必须通知客户端,但仍必须从队列中删除该请求,以便可以发送下一个请求.必须发送下一个请求(队列中最早的请求).jsf.ajax.request 有关Ajax请求队列的更多详细信息,请参阅JavaScript文档.

这样做是为了确保JSF视图状态的完整性和线程安全性(并且因此本身也可以查看范围内的bean).

  • 在p:ajax上设置async true,使其不排队. (9认同)