2013-06-12 131 views
0

我正在嘗試構建一些小函數,用於處理非常具體的事情並在處理程序中使用它們。 我正在嘗試這樣做,發送JSON對象到一個PHP腳本,然後以json對象的形式返回響應。jquery .done返回值 - 混淆

這是我寫到目前爲止功能:

function isRegistered(courseObj){ 
    var posting = $.post("is-user-registered.php", courseObj); 
    posting.done(function(data){ 
     var res = $.parseJSON(data); 
     if(res.response == "success"){ 
      return 0; 
     } else { 
      return 1; 
     } 
    }); 
} 

這是處理程序:

$('a.button.findDelegate').bind("click", function(){ 
    var textToSearch = $('#findUserBox').val(); 
    var txtObj = {}; 
    var courseObj = {}; 

    courseObj['courseId'] = $('input[name=courseId]').val(); 
    courseObj['email'] = txtObj['text'] = textToSearch; 

    if(txtObj['text'].length > 2){ 
     if(isRegistered(courseObj) === 0){ 
      console.log("search user and then add it to the list"); 
     } else { 
          console.log("this user is already registered lets throw an error"); 
        } 
    } 
    return false; 
}); 

的問題是,isRegistered總是返回undefined。 我幾乎可以肯定,這與.done沒有被直接執行有關,因爲在Chrome瀏覽器undefined實際上是在ajax調用之前被記錄的。

如果是這種情況,我該如何強制處理程序等待isRegistered響應?

我打開所有的建議,我可能使用錯誤的工具(jQuery)來做到這一點?

抱歉,缺乏清晰度。

+0

AJAX在默認情況下是異步的,你需要使用的要求回調函數的代碼,根據這個 –

+0

的可能重複你的邏輯[如何返回從響應AJAX調用?](http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call) – gdoron

+0

我增加了更深入的答案您的問題。我的答案是幫助你還是應該刪除它/ – gdoron

回答

1

done因爲所有異步回調將在某個時間返回,也許會在1ms或10min內(並且一些回調永遠不會像error\success那樣激發)。

這意味着您只能在回調中使用這些值。

嘗試的代碼更改爲類似:

function isRegistered(courseObj){ 
    var posting = $.post("is-user-registered.php", courseObj); 
    posting.done(function(data){ 
     var res = $.parseJSON(data); 
     if(res.response == "success"){ 
      // Do what's needed here ------------------------------ 
     } else { 
      // Do what's needed here ------------------------------ 
     } 
    }); 
} 
+0

我明白這一點,但這意味着我必須獲得比他們需要的更多的功能。 以下面的代碼爲例: //處理程序1 if(isRegistered()=== true){ deleteUser(); } //處理程序2 if(isRegistered()=== true){ editUser(); } 如果我把代碼放在那個需要做某些事情的函數中,那麼我將不能很容易地重用這個函數:( –

+0

@AngeloMoreira,你可以用'if(res.response ==「成功「){DoSomething();} ...' – gdoron