2012-03-18 102 views
0

我目前正在開發一個Symfony2項目,該項目涉及提交表單並對文件系統執行冗長的操作(遞歸副本)。在Symfony2中使用AJAX併發操作

此刻,用戶必須等到文件系統操作完成並在重定向之前進行表單處理。我曾嘗試通過使用一些簡單的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的是構建Web應用程序,我希望它允許併發控制的請求......形容「不能夠執行表單提交和查詢另一個動作/控制器「更精確地請。 – greg0ire 2012-03-18 23:16:18

+0

只要AJAX請求在jQuery的.submit上執行(這是一個用一些文本嘗試返回Response的接收器)「receiveReq.open(」GET「,'{{path('fetchProgress')}}'),負責處理表單的控制器({{path('performSomeAction')}})不會返回任何東西,我得到了AJAX請求的響應,但是沒有來自表單提交控制器的響應。一個表單,頁面加載一秒鐘,直到AJAX請求和負責提交表單提交的控制器響應。 – 2012-03-19 11:32:10

+0

您確定您有2個請求嗎?請檢查您的訪問日誌 – greg0ire 2012-03-19 11:54:49

回答

4

這可能是由於會話LO引起的並在這裏解釋: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()來解決它,因爲之後我也重寫了它,使用@ greg0ire指出的jQuery。 – 2012-11-13 14:37:15