我對jQuery實現它的AJAX方法很新鮮。jquery ajax調用不是異步的
我有一個簡單的設置,訪問兩個不同的頁面,一個需要10秒鐘完成(我有一個計時器設置)和一個檢查第一頁的狀態。
這兩個函數是progressCheck()
,它每秒鐘以最新的狀態請求它的頁面,beginLogin()
需要10秒鐘來加載。我在服務器上的用戶對象中設置了一個值,這兩個頁面都通過symfony 1.4訪問。
問題是,progressCheck()
工作正常,直到我點擊beginLogin()
,然後在beginLogin()
完成之前沒有更改。我有兩個函數設置爲異步運行。我知道這一定是一件簡單的事情,但我無所適從。
我跑了Firebug的 - 淨運行此頁面時,其結果是:
了一批progressCheck()
的等待期間爲10秒的電話叫,但淨說,他們在〜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 下面是返回數據爲兩頁的兩個PHP函數的調用
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, 0, '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', 0, 'sfGuardSecurityUser');
$this->login_value = $user->getAttribute('login_script', 0, 'sfGuardSecurityUser');
$conn = $this->connectTestDb();
$query = sprintf("SELECT * FROM company_type WHERE id = 1;");
$result = mysql_query($query, $conn);
$this->login_value = mysql_result($result, 0, '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, 0, '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', $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, 0, 'name');
}
else
{
DataMan::logRawMessage('Unable to set company ids user ['.$user->getAttribute('user_id', null, 'sfGuardSecurityUser').'] '.__LINE__, sfLogger::WARNING);
}
// just for testing sleep!
if(DEBUG === true)
sleep(5);
}
檢查您在服務器端設置的共享用戶對象,它可能在beginLogin()訪問它時被鎖定,所以下一個對progresscheck()的請求正在等待在服務器端釋放該鎖。 – 2011-02-23 04:59:20
是您在線託管的服務器端代碼嗎? – Anurag 2011-02-23 05:15:24
@Furqan用戶對象只能被該特定用戶訪問,所以我設置了保存到數據庫的功能並在兩個瀏覽器中打開了相同的頁面。我點擊'beginLogin()'的瀏覽器掛了10秒,而正在運行'progressCheck()'的第二個瀏覽器在正確的時間更新了新值。 – Patrick 2011-02-23 05:54:46