Я редактирую этот пост в третий раз, после дополнительных тестов и отладок я продолжаю узнавать о новых материалах. Вот моя ситуация:
У меня есть метод thinker
, который требует времени для обработки. Из-за этого я решил позвонить через Ajax и показать индикатор пользователю. До этого момента - прекрасно работает.
Еще одна вещь, которую я пытаюсь сделать, - это показать пользователю прогресс «мышления», в процентах или просто тиках, что угодно.
Это не трудно сделать, потому что thinker
имеет цикл, и на каждой итерации он сохраняет новые thoughts
в базу данных.
Так что в основном - counter
просто показывает количество «мыслей» (привязанных к конкретному идентификатору).
Проблема в том, что опция обратного вызова не вызывается.
Что ж, поцарапайте, что это называется, но только дважды. До того, как запрос (показывает ноль) и после того, как thinker
закончится, подумайте, когда он больше не нужен (покажите всю сумму).
Вот упрощенный код:
<span id="indicator" style="display: none;"><img src="/img/ajax-loader.gif" alt="" /></span>
<span id="progress"></span>
<span id="clicker" style="cursor: pointer;">Do it!</span>
<script type="text/javascript">
//<![CDATA[
Event.observe('clicker', 'click', function(event) {
new Ajax.Request(
'/examples/thinker/123',
{asynchronous:true, evalScripts:true, onComplete:function(request, json) {Element.hide('indicator');}, onLoading:function(request) {Element.show('indicator');}}
);
new Ajax.PeriodicalUpdater(
'progress',
'/examples/counter/123',
{asynchronous:true, evalScripts:true, frequency: 2}
);
});
//]]>
</script>
EDIT:
Благодаря использованию консоли Firebug XHR мне удалось немного углубиться в это. Я на самом деле пошел с JQuery (просто для тестирования, но это не помогло).
Проблема в CakePHP, я думаю. Я имею в виду - когда я создал идентичный сценарий с базовым PHP, он работает одновременно. Когда я сделаю это с Cake, будет вызван counter
, затем будет вызван thinker
, и будет вызван counter
каждые две секунды, но он ответит только после того, как thinker
закончит думать.
Возможно ли, что Cake не удастся обработать второй запрос, пока первый не будет завершен?
С уважением,
Пол