#ajax #primefaces
#ajax #основные возможности
Вопрос:
Я хотел бы иметь возможность остановить выполнение длительной задачи, запущенной с помощью CommandButton:
<p:commandButton id="startBatch"value="Go" actionListener="#{batchController.sendBatch()}"ajax="true" />
Итак, в моей модели я добавил логическое значение «прервать» и внутри sendBatch() Я добавил проверку, чтобы остановить цикл, когда логическое значение становится истинным:
for (int i = 1; i <= batch.size(); i ) {
if (batchModel.isAbort()) {
break;
}
}
И в моем XHTML я добавил новую кнопку, которая вызывает метод, который устанавливает это логическое значение в true:
<p:commandButton id="abortBatchButton"
value="Abort"
actionListener="#{batchController.abort()}"
ajax="true"/>
Проблема в том, что abort() вызывается после завершения метода sendBatch().
Есть ли простой способ реализовать это?
Комментарии:
1. Попробуйте
async="true"
нажать на кнопку, которая запускает пакет. Кстати,ajax="true"
по умолчанию дляp:commandButton
.2. Ну, теперь ты меня знаешь 🙂 Это сработало, спасибо. Как обычно, я попрошу вас опубликовать ответ.
Ответ №1:
По умолчанию p:commandButton
используется Ajax. Однако несколько действий (запросов) по умолчанию помещаются в очередь и выполняются синхронно. Итак, если вы начали длительное действие, следующее действие будет обработано после завершения предыдущих действий.
Если вы не хотите ставить действия в очередь, вы должны использовать async="true"
на соответствующих кнопках.
В вашем случае:
<p:commandButton id="startBatch"
value="Go"
async="true"
actionListener="#{batchController.sendBatch()}" />
Я удалил ajax="true"
, поскольку он установлен по умолчанию.