php – jquery ajax调用不是异步的
我对jQuery实现它的
AJAX方法很新鲜.
我有一个简单的设置,访问两个不同的页面,一个需要10秒钟完成(我有一个计时器设置)和一个检查第一页的状态. 这两个函数是progressCheck(),它每秒以最新状态请求其页面,而beginLogin()需要10秒才能加载.我在服务器上的用户对象中设置了一个值,两个页面都通过symfony 1.4访问. 问题是progressCheck()正常工作,直到我单击beginLogin(),然后在beginLogin()完成之前不会进行任何更改.我有两个函数设置为异步运行.我知道这一定很简单,但是我很茫然. 我在运行此页面时运行了Firebug-Net,结果是: 在10秒呼叫的等待期间调用了许多progressCheck(),但Net表示它们在没有任何等待时间的情况下运行了大约200毫秒. 有任何想法吗? 代码如下: <button onclick="beginLogin();">Begin Login</button> <button onclick="progressCheck();">Check Progress</button> <button onclick="clearCheck();">Clear Check</button> <br/> <div id="result_div"> </div> <div id="progress_div"> </div> <style type="text/css"> #progress_div { width: 800px; height: 200px; border: 1px solid #CCCCCC; overflow: scroll; background-color: #AAEEFF; } #result_div { width: 800px; height: 300px; border: 1px solid #CCCCCC; overflow: scroll; background-color: #FFEEAA; } </style> <script type="text/javascript"> function beginLogin() { try { var login_url = "http://example.com/home/loginScript"; $.ajax({ url: login_url,success: function(data){ $("#result_div").append('<pre>'+data+'</pre><hr/>'); alert("finished"); } }); } catch(e) { alert("There was an error beginning the login: " + e); return false; } return true; } function progressCheck() { try { var check_url = "http://example.com/home/checkLoginProgress"; $.ajax({ url: check_url,success: function(data){ $("#progress_div").append('<pre>'+data+'</pre><hr/>'); } }); } catch(e) { alert("There was an error checking the progress: " + e); return false; } check_id = setTimeout('progressCheck()',1000); return true; } // set progress checking function to call every second var check_id = setTimeout('progressCheck()',1000); function clearCheck() { try { clearTimeout(check_id); } catch(e) { alert("There was an error clearing the check: " + e); return false; } return true; } </script> UPDATE define('DEBUG',true); public function executeCheckLoginProgress(sfWebRequest $request) { if($this->getUser()->hasAttribute('login_script','sfGuardSecurityUser')) $this->login_progress = $this->getUser()->getAttribute('login_script',-1,'sfGuardSecurityUser'); else $this->login_progress = '[undefined]'; $conn = $this->connectTestDb(); $query = sprintf("SELECT * FROM company_type WHERE id = 1;"); $result = mysql_query($query,$conn); $this->login_progress = mysql_result($result,'name'); if($request->isXmlHttpRequest()) { // this is an ajax all,only return value $this->getResponse()->setHttpHeader("Content-type","text/plain"); $this->getResponse()->setContent($this->login_progress); return sfView::NONE; } } public function executeLoginScript(sfWebRequest $request) { $user = $this->getUser(); if(!$user->hasAttribute('login_script','sfGuardSecurityUser')) $user->setAttribute('login_script','sfGuardSecurityUser'); $this->login_value = $user->getAttribute('login_script','sfGuardSecurityUser'); $conn = $this->connectTestDb(); $query = sprintf("SELECT * FROM company_type WHERE id = 1;"); $result = mysql_query($query,$conn); $this->login_value = mysql_result($result,'name'); $result = $user->assignAccessLevelIds(); if($result === true) { $this->login_value += 5; $user->setAttribute('login_script',$this->login_value,'sfGuardSecurityUser'); $query = sprintf("UPDATE company_type SET `name` = '%s' WHERE id = 1;",mysql_real_escape_string($this->login_value)); $result = mysql_query($query,$conn); $this->login_progress = mysql_result($result,'name'); } else { DataMan::logRawMessage('Unable to set access level user ['.$user->getAttribute('user_id',null,'sfGuardSecurityUser'),sfLogger::WARNING); } // just for testing sleep! if(DEBUG === true) sleep(5); $result = $user->assignCompanyIds(); if($result === true) { $this->login_value += 5; $user->setAttribute('login_script','name'); } else { DataMan::logRawMessage('Unable to set company ids user ['.$user->getAttribute('user_id','sfGuardSecurityUser').'] '.__LINE__,sfLogger::WARNING); } // just for testing sleep! if(DEBUG === true) sleep(5); } 解决方法
我发现了javascript调用挂起的原因.
为了防止用户会话数据发生race condition,PHP会锁定数据,直到出现两种情况之一. >之前调用的PHP脚本调用session_write_close(). 遵循不调用session_start()的服务器调用应允许真正的异步调用的逻辑,我创建了一个虚拟PHP页面,它只是吐出一个简单的字符串,并在10秒脚本运行时每隔一秒调用该页面.它跑得很好. 解决方案来自阅读symfony论坛上的this discussion. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |