Параллельная операция с использованием AJAX в Symfony2 - PullRequest
0 голосов
/ 19 марта 2012

В настоящее время я работаю над проектом Symfony2, который в какой-то момент включает отправку формы и выполнение длительной операции в файловой системе (рекурсивная копия).

В данный момент пользователь должен дождаться завершения работы файловой системы и обработки формы, прежде чем будет перенаправлен. Я попытался улучшить эту функциональность с помощью простого AJAX. Я столкнулся с проблемой невозможности отправки формы и одновременного запроса другого действия / контроллера.

Разрешает ли Symfony2 одновременные запросы контроллера? Если это не так, есть ли способ завершить достижение чего-то, что будет работать как базовый параллелизм?

Вот схема того, что я пытаюсь сделать с точки зрения кода:

<form action="{{ path('performSomeAction', { 'id': client.getId(), 'someId':some.someId() }) }}" method="post" {{ form_enctype(form) }}>
{{ form_widget(form) }}

<input type="submit" />

И это то, что я пытаюсь сделать одновременно с отправкой формы, используя асинхронный XMLHttpRequest:

<script language="JavaScript" type="text/javascript">        
        function getXmlHttpRequestObject() {
            if (window.XMLHttpRequest) {
                return new XMLHttpRequest(); //Not IE
            } else if (window.ActiveXObject) {
                return new ActiveXObject("Microsoft.XMLHTTP"); //IE
            } else {
                alert("Your browser doesn't support the XmlHttpRequest object. ");
            }
        }

        var receiveRequest = getXmlHttpRequestObject();

        function handleFetchProgress() {
            if (receiveRequest.readyState == 4) {
                var newData = receiveRequest.responseText;
                var oldData = document.getElementById("span_result").innerHTML;
                var toDisplay = oldData +  "<br />" + newData;
                document.getElementById("span_result").innerHTML = toDisplay;
            }
        }

        function fetchProgress() {     
            if (receiveReq.readyState == 4 || receiveReq.readyState == 0) {
                receiveReq.open("GET", '{{ path('fetchProgress') }}', true);
                receiveRequest.onreadystatechange = handleFetchProgress;
                receiveRequest.send(null);
            }         
        }

        $(document).ready(function() {
            $('form').submit(function() {
                setInterval("fetchProgress()", 1000);
                return false;
            });
        });

1 Ответ

4 голосов
/ 12 ноября 2012

Это, вероятно, вызвано блокировкой сеанса и объясняется здесь: Как убить сеанс в Symfony2?

Вам необходимо разблокировать режим записи сеанса, чтобы принять другой запрос на доступ к нему.

Я написал в блоге сообщение о работе с асинхронными запросами: http://blog.alterphp.com/2012/08/how-to-deal-with-asynchronous-request.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...