10

私は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>

私の関数には、遅延をシミュレートするための関数login.retrieveGalaxies呼び出しがあります。コンポーネントが 1 秒か 2 秒で更新され、コンポーネントが8 秒で更新されることsleep(8000)を期待していますが、すべてが 8 秒で更新されます。locationChoice1locationChoice2positionChoicetest

これは正しい動作ですか?

パラメータで遊んでみましたasyncが、結果は変わりませんでした。

4

1 に答える 1

19

それらは本当に非同期です (JS コンテキストはブロックされません。つまり、他の任意の JS コードをブロックされることなく同時に実行できます)。表示されている動作は、それらがキューに入れられているためです。そのため、非同期ではないように見えます。

このキューイング動作は、 JSF 2 仕様の 13.3.2 章で指定されています。

13.3.2 Ajaxリクエストのキューイング

すべての Ajax リクエストは、サーバーに送信される前にクライアント側のリクエスト キューに入れられ、Ajax リクエストが送信された順序で処理されるようにする必要があります。キューで最も長く待機しているリクエストが、次に送信されるリクエストです。リクエストが送信された後、Ajax リクエスト コールバック関数はキューからリクエストを削除する必要があります (デキューとも呼ばれます)。リクエストが正常に完了した場合は、キューから削除する必要があります。エラーが発生した場合、クライアントに通知する必要がありますが、次の要求を送信できるように、要求をキューから削除する必要があります。次の要求 (キュー内の最も古い要求) を送信する必要があります。jsf.ajax.request Ajax リクエスト キューの詳細については、JavaScript のドキュメントを参照してください。

これは、JSF ビュー ステートの整合性とスレッド セーフを保証するために行われます (したがって、本質的にスコープ Bean も表示されます)。

于 2012-12-06T15:36:05.900 に答える