2010-12-02 74 views
0

我已經在很多地方看過這個,我可能是個白癡,因爲這樣做很多,但這是我的情況。「等待」ReadyState在返回值前爲4

我想在我的網站IFF電子郵件旁邊的一個電子郵件字段中顯示一個複選框未使用已註冊。

什麼我已經是這樣的:

$('[name=reg_email]').change(function() { 
    if(!emailUsed()) { 
     //Update image to be a green checkmark 
    } else { 
     //Update image to be a huge red X 
    } 
} 

而我的「emailUsed」功能應當根據電子郵件地址是否是在數據庫中返回一個JavaScript布爾變量。爲了實現這一點,我創建了一個腳本來確定它是否存在。所以emailUsed()函數只需要調用腳本和回報,但我需要等到的readyState == 4我回來之前,所有的我已經找到了等待的readyState等於4的方法阻止我返回值在所有:

function emailUsed() { 
    var req = $.get('scripts/email_used.php?email='+$('[name=reg_email]').val()); 

    //Wait for req.readystate to be 4 

    return req.responseText == 'True'; 
} 

但我無處可以找到解釋如何做到這一點,仍然返回一個值的東西。似乎一切都使用回調函數,這和那,但我不能讓這個方法返回一個值。

幫助,請!

回答

2

做一個忙等待req.readyState === 4被認爲是不好的設計實踐。你正在綁定UI線程並阻止瀏覽器更新。如果服務器響應速度慢,用戶將得到提示是否取消進一步處理。

如果您看看$ .get(),它會將完成函數作爲其參數之一。您應該在此功能中執行您的成功/失敗邏輯。您可以通過禁用「提交」按鈕來完成此操作,直到您收到成功消息。

+0

太好了!謝謝。這本來對我來說有點困惑,但我明白了。 – TigerTrussell 2010-12-02 22:06:31

0

您錯過了異步方法的觀點。主要的一點是有一些計算需要完成,並且你不希望綁定當前正在等待這個計算的線程。因此,長時間運行的方法不應該返回值,而是應該提供一個回調,它將傳遞調用的狀態,而不會讓整個應用程序等待。

我建議以下

function emailUsed (callback) { 
    var req = $.get('scripts/email_used.php?email='+$('[name=reg_email]').val(), 
     function(data) { 
      callback(data == 'True'); 
     } 
); 
} 

$('[name=reg_email]').change(function() { 
    emailUsed(function(isUsed){ 
     if (isUsed) { 
      //Update image to be a green checkmark 
     } else { 
      //Update image to be a huge red X 
     } 
    }); 
}