2012-10-29 112 views
0

驗證發送傳真表單時,我正在檢查傳真是否已通過我們的軟件傳真包發送。這是對由腳本執行的表的簡單查詢,如果以前的傳真存在,則返回一些文本,否則返回空白。爲什麼在xmlhttp.responseText之後沒有設置變量?

我發現flag_stop_fax變量仍然設置爲零,即使我有一些響應文本(例如:「傳真已發送。」)。

flag_stop_fax = 0; 
xmlhttp.onreadystatechange=function() 
{ 
    if (xmlhttp.readyState==4 && xmlhttp.status==200) 
    { 
     var response = xmlhttp.responseText; 
     if (response!='') 
     { 
      flag_stop_fax = 1; 
      alert(response); 
     } 
    } 
} 

xmlhttp.open('GET','/check_for_active_fax.php?fax_number=' + fax_number + '&t='+Math.random(),true); 
xmlhttp.send(); 

alert(flag_stop_fax); // shows "0" even when I have a non-blank response from xmlhttp.responseText 

還有一些其他的驗證位,但上面的腳本有望解釋這個問題。我不使用't'變量 - 這只是防止瀏覽器緩存。

那麼,爲什麼我的flag_stop_fax設置爲0呢?

+1

AJAX是'Asynchronous'。您提醒您注意在回調代碼之前運行。 – TheZ

+1

首先回答這個問題 - Ajax中的A代表什麼? – asawyer

回答

0

首先你必須明白,AJAX是異步的。當您執行xmlhttp.send();,您的請求被髮送和代碼將繼續執行,因此當運行,接下來的事情就是:

alert(flag_stop_fax); 

此時,flag_stop_fax仍然是零,因爲請求尚未完成。

您爲xmlhttp.onreadystatechange指定的回調函數僅在請求完成時運行。這裏的執行不是順序的。它是這樣的:

  1. xmlhttp.send(); - 請求已經開始
  2. alert(flag_stop_fax); - 變量被驚動

    ...
    ...
    (一段時間後,服務器的時候回答)

    xmlhttp.onreadystatechange執行,更改flag_stop_fax變量。

+0

那麼如果檢查返回true(即,響應不是空白),那麼是否沒有辦法停止表單提交? –

+0

有一種方法。你必須停止表單提交。等待迴應。如果回覆爲真,請提交表單。無論您想要做什麼,都必須在回調中完成,因爲您無法知道您的請求何時完成。 – kapa

+0

我可以用sleep()來做到嗎? –

相關問題