2012-03-18 3 views
0

В настоящее время я работаю над проектом Symfony2, который в какой-то момент требует отправки формы и выполнения длительной операции с файловой системой (рекурсивная копия).Параллельная работа с использованием AJAX в 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; 
      }); 
     }); 

+0

Symfony2 для создания веб-приложений, я надеюсь, что это позволяет одновременных запросов контроллера ... Описать «не в состоянии выполнить отправку формы и запрашивая другое действие/контроллер одновременно "более точно, пожалуйста. – greg0ire

+0

Как только выполняется запрос AJAX на .submit jQuery (это тот, который пытается вернуть Response с некоторым текстом - «receiveReq.open» («GET», «{{path ('fetchProgress')}} '), контроллер, ответственный за обработку формы ({{path ('performSomeAction')}}) ничего не возвращает. Я получаю ответ от запроса AJAX, но ответа от контроллера представления формы нет. Итак, я отправляю форма, страница загружается в течение одной секунды, пока не будет получен ответ от запроса AJAX, и контроллер, ответственный за прекращение подачи формы, отключится. –

+0

У вас есть 2 запроса? Проверьте свой журнал доступа. – greg0ire

ответ

4

Это, вероятно, вызвано сессии Ио ck и объясняется здесь: How do I kill a session in Symfony2?

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

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

+1

Именно это и вызывало проблему! Вопрос довольно устарел, и я решил его, выполнив session_write_close(), с тех пор я также переписал его, чтобы использовать jQuery, как указано в @ greg0ire. –