2014-04-15 34 views
5

首先,我已閱讀此主題jQuery AJAX function return true or false returning only false while its all good,What to return for jQuery's ajax data param in callback function?,How return true or false function of data response ajax?我無法弄清楚如何使這個工作。ajax返回true/false - 我已經實現了回調

$("#btn_go").on('click', function(){ 
    if(validateUserDetails() == false){ 
      return; 
    } 
}); 

因此,功能validateUserDetails有以下幾點:

function validateUserDetails(){ 
    var bool = false; 

    $.ajax({ 
     url: 'response.php?type=validateUserDetails', 
     type: 'POST', 
     dataType: 'json', 
     data: {name: $("#checkout_name").val(), email: $("#checkout_email").val(), "country": $("#checkout_country").val(), 
       "city": $("#checkout_city").val()}, 
     success: function(data){ 
      console.log(data); // this is currently returning FALSE 
           // Which is totally correct! 
      if(data == true){ bool = true; } 
      return trueOrFalse(bool); 
     } 
    }); 
} 

function trueOrFalse(bool){ 
    return bool; 
} 

但是這是行不通的,因爲如果我輸出的功能,我得到「未定義」,這意味着該函數是不是重新調整正確的值。 console.log(validateUserDetails()); // = undefined

我在做什麼工作?

+0

您不必在validateUserDetails函數返回......所以不返回任何 – Regent

+0

我不沒有?你沒有看到'return trueOrFalse(bool)'? – Linesofcode

+0

它沒有在任何地方使用:匿名函數爲'return',在成功回調時調用 – Regent

回答

10

ajax請求是asyncronous。不要使用sync: true選項,這不是一個好主意。 你可以做的是使用promiseajax回報,所以:

function validateUserDetails(){ 

return $.ajax({ 
    url: 'response.php?type=validateUserDetails', 
    type: 'POST', 
    async: false, 
    dataType: 'json', 
    data: {name: $("#checkout_name").val(), email: $("#checkout_email").val(), "country": $("#checkout_country").val(), 
      "city": $("#checkout_city").val()}, 
    success: function(data){ 
     console.log(data); // this is currently returning FALSE 
    } 
}); 

}

$("#btn_go").on('click', function(){ 
    validateUserDetails().done(function(data){ 
     if(data == "someValue") 
      return "whatever you want"; 
    } 
}); 
2

由於沒有人回答了呢,我會:

首先,你可以嘗試同步請求

function validateUserDetails() { 
    var bool = false; 

    $.ajax({ 
      url: 'response.php?type=validateUserDetails', 
      type: 'POST', 
      async: false, 
      dataType: 'json', 
      data: {name: $("#checkout_name").val(), email: $("#checkout_email").val(), "country": $("#checkout_country").val(), "city": $("#checkout_city").val()}, 
      success: function(data) { 
       console.log(data); // this is currently returning FALSE 
            // Which is totally correct! 
       if (data == true) { 
        bool = true; 
       } 
      } 
    }); 

    return trueOrFalse(bool); 
} 

如果不能接受,你可以使用$.Deferred()

function validateUserDetails() { 
    var deferred = $.Deferred(); 
    var bool = false; 

    $.ajax({ 
      url: 'response.php?type=validateUserDetails', 
      type: 'POST', 
      dataType: 'json', 
      data: {name: $("#checkout_name").val(), email: $("#checkout_email").val(), "country": $("#checkout_country").val(), "city": $("#checkout_city").val()}, 
      success: function(data) { 
       console.log(data); // this is currently returning FALSE 
            // Which is totally correct! 
       if (data == true) { 
        bool = true; 
       } 
      } 
      complete: function() { 
       deferred.resolve(trueOrFalse(bool)); 
      } 
    }); 

    return deferred.promise(); 
} 

function test() { 
    var promise = validateUserDetails(); 
    promise.done(function(result) { 
     console.log("Bool: " + result); 
    }); 
} 
+0

我已upvoted您的帖子,因爲它也可以。但我認爲我設定爲「最終答案」的帖子比較好。謝謝。 – Linesofcode

+0

@ user3355243這是你的選擇:)是的:如果你有隻有1個異步請求鏈,.done()看起來更好,更簡單 – Regent

+0

不能這'deferred.resolve(trueOrFalse(布爾));'只是'延遲.resolve(布爾);'? – dbinott

1

你的函數validateUserDetails沒有返回值,她只是執行一個異步函數。 異步函數返回true或false,但沒有捕獲它。

是這樣的:

function validateUserDetails(){ 

    // asynchronous function 
    $.ajax({...}); 

    return undefined; 
} 

如果試圖console.log(trueOrFalse(bool));你會看到「真」或「假」,但你不能用「回」到異步函數。你必須做一些成功的功能,誰使用「數據」(日誌,或其他功能)

+0

+1是的,你所說的是正確的。可以將參數傳遞給函數,然後在成功函數中使用這些參數。 – Linesofcode