2014-04-15 12 views
5

Prima di tutto ho letto questo argomento 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? e non riesco a capire come farlo funzionare.restituisce ajax true/false - Ho implementato una richiamata

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

Quindi, la funzione validateUserDetails ha la seguente:

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; 
} 

Ma questo non sta funzionando, perché se l'uscita io la funzione ottengo "indefinito", il che significa che la funzione non è risintonizzazione la corretta valore. console.log(validateUserDetails()); // = undefined

Cosa sto indossando?

+0

Non è il ritorno in funzione validateUserDetails ... Quindi nulla viene restituito – Regent

+0

I don avere? non vedi lì 'return trueOrFalse (bool)'? – Linesofcode

+0

Non è utilizzato da nessuna parte: è "ritorno" per la funzione anonima, richiamato con callback di successo – Regent

risposta

10

ajax La richiesta è asyncronous. Non utilizzare l'opzione sync: true, non è davvero una buona idea. Che cosa si può fare è quello di utilizzare i promise che le ajax restituisce, in modo da:

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

Come nessuno ha ancora risposto, io:

Prima di tutto, si può provare richiesta di sincronizzazione

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); 
} 

Se non è accettabile, è possibile utilizzare $.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

Ho svitato il tuo post perché funziona anche quello. Ma penso che il post che ho impostato come "risposta finale" sia migliore. Grazie. – Linesofcode

+0

@ user3355243 è la tua scelta :) E sì: se hai una catena di solo 1 richiesta asincrona, .done() sembra meglio e più semplice – Regent

+0

non può questo 'deferred.resolve (trueOrFalse (bool));' solo essere 'differito .resolve (bool); '? – dbinott

1

La tua funzione validateUserDetails non restituisce alcun valore, esegue semplicemente una funzione asincrona. La funzione asincrona restituisce vero o falso, ma nulla per catturarlo.

E 'in questo modo:

function validateUserDetails(){ 

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

    return undefined; 
} 

Se si tenta console.log(trueOrFalse(bool)); si vedrà "vero" o "falso", ma non è possibile utilizzare "ritorno" in funzione asincrona. È necessario eseguire qualcosa nella funzione di successo, che utilizza "dati" (registro o un'altra funzione)

+0

+1 Sì, ciò che hai detto è corretto. È possibile passare gli argomenti alla funzione e quindi utilizzare tali argomenti nella funzione success. – Linesofcode

Problemi correlati