2016-06-14 20 views
0

Dies ist mein Codebeispiel

var formValidate = function() { 
    var url = 'someurl'; 
    var checkC = function (url, callback) { 
    $.get(url, function(data) { 
     if(data.indexOf('OK') == 0) return callback('OK'); 
    }) 
    }; 
    checkC(url, function(data) { 
    if(data == 'OK') return false; 
    }); 
    return true; 
} 

Mein Code ist ziemlich ähnlich wie Adam Rackis des in dieser Frage Wait for jQuery $.get function to finish before running code. Aber leider warten Sie nicht auf die Datenrückgabe. formValidate() gibt nur true zurück. Ich möchte diese Funktion verwenden, um einige Bedingungen zu überprüfen, bevor die Daten an den Server von Form

form.on('submit', function(){ 
    if(formValidate()) form_send(); 
}) 

Senden Kann mir jemand sagen, wo ich in obigen Code falsch war?

+0

Könnten Sie Ihre Geige überprüfen, scheint HTML fehlt dort. – Deep

+0

Ich poste hier, wirklich gibt es keine Notwendigkeit in html, nur um 'formValidate' zu ​​warten, bis $ .get() gibt einige Daten zurück ... – user1128677

+0

Sie rufen' formValidate' ohne '()' –

Antwort

1

Das erste Problem ist, dass formValidate()true synchron unabhängig von der Ajax-Anfrage zurückgeben.

Wenn Sie warten möchten, um Ihre Werte von den Rückruffunktionen zurückzukehren. Hier sollten Sie form_send() aus dem Erfolgs-Callback aufrufen, damit es auf den asynch-Aufruf wartet. Und Sie können es tatsächlich viel einfacher ohne checkC() auch machen. Ändern Sie den Code ein wenig und verwenden getan und Versprechen nicht:

var formValidate = function() { 
    var url = 'someurl'; 

    $.get(url) 
     .done(function (data) { 
      if (data.indexOf('OK') == -1) { 
       console.log("error"); 
       return; 
      } 
      form_send(); 
     }) 
     .fail(function() { 
      console.log("error"); 
      return; 
     }) 
} 
1

Sie können dies nicht tun, da $ .get asynchron aufgerufen wird.

var formValidate = function() { 
    var url = 'someurl'; 
    var checkC = function (url, callback) { 
     $.get(url, function(data) { 
      if(data.indexOf('OK') == 0) return callback('OK'); 
     }); 
    }; 


    checkC(url, function(data) { 
     // this return to this enclosing callback function but not formValidate 
     if(data == 'OK') return false; 
    }); 

    //this is the only return statement for formValidate function 
    return true; 
} 

Eine Abhilfe i vorgeschlagen wird nur Ihre form_send() aufrufen, in der Callback zum Beispiel

form.on('submit', formValidate); 

Und für Ihre formValidate,

var formValidate = function() { 
    var url = "someurl"; 
    $.get(url, function(data) { 
     if(data.indexOf('OK') == 0) { 
      form_send(); 
     } 
    }); 
};