2016-07-25 15 views
0

Ich habe zwei Gruppen von Funktionen:jQuery führen eine Gruppe von Funktionen nach dem anderen

$(document).ready(function() { 

    var id = $(this).attr('id'); 

    // First group of functions  
    getCountry(id); 

    // Second group of functions 
    getResult(id, 'all'); 

}); 

Innerhalb jeder Gruppe sind Funktionen Ajax Anrufe und miteinander verkettet. Es bedeutet, dass getCountry() zuerst ausgeführt wird und getRegion() auf success Ajax Eigenschaft aufruft, dann getRegion() Anrufe getTown() auf success Ajax Eigentum und so weiter. Diese Funktionen werden verwendet, um eine Formular-Dropdown-Liste (selects) zu füllen. Ich werde dann die Städte der Region des Landes bekommen, die ich ausgewählt habe.

Ich brauche die Formularlisten, die ausgefüllt werden müssen, bevor ich die getResult() Funktion ausführen kann.

Ich will nicht getResult() innen getCountry() nennen, weil ich auch getResult() verlangen, wenn der Benutzer Änderungen Optionen ausgewählt, nachdem die Seite geladen wird. In diesem Fall wird getResult() verschiedene andere Parameter als 'all' annehmen.

ich mich für eine einfache Möglichkeit, mich auf meine $(document).ready(function(), um neu zu schreiben zu sagen:

  1. Erstens: laufen getCountry() und seine Abhängigkeit Funktionen
  2. dann getResult() und seine Abhängigkeit Funktionen laufen

Ich bin ein wenig verloren in jQuery doc über Rückrufe und promise(). Ich würde wirklich etwas Hilfe schätzen, um mir zu erlauben weiterzumachen, wissend, dass ich später ernsthaft zum Arzt zurückkehren werde.

+0

Stellen Sie die 'getCountry'-Funktion auf' getResult 'und rufen Sie sie auf, wenn alle Ihre AJAX-Anfragen beendet sind. –

+0

Entschuldigung, ich verstehe Ihren Kommentar nicht ... – wiltomap

+0

Wie @RoryMcCrossan sagte, senden Sie eine Referenz von getResult in getCountry. Z.B. getCountry (id, 'alle', getResult). Und ändern Sie die getCountry-Definition so, dass sie einen weiteren Parameter wie getCountry (id, param2, resultCallback) enthält. Sobald die Verarbeitung der Methode getCountry abgeschlossen ist, rufen Sie getResult wie ResultCallback() auf; in diesem. –

Antwort

1

Sie können versuchen, Deferred Object

// Create a deferred object 
var deferred = $.Deferred(); 

Definieren Sie die Funktion auf dem latente Objektauflösung

// This function executes as soon as the deferred object gets resolved 
deferred.done(function(value) { 
    getResult(id, 'all'); 
}); 

Auf dem Rückruf der letzten Funktion von getCountry() Gruppe, lösen das latente Objekt aufgerufen werden :

// Resolve the deferred object 
deferred.resolve(response); 

Überprüfen Sie diese article

+0

Netter Artikel @kapantzak. Fügen Sie viele Details hinzu, um das Thema zu verstehen. –

0

Versuchen Sie die Verwendung von Deferred wie unten.

$(document).ready(function() { 

    var id = $(this).attr('id'); 
    var deferred = $.Deferred(); 
    // First group of functions  
    getCountry(id); //Inside getCountry method, make a call to deferred.resolve(); 

    // Second group of functions 
    //Now make call to getResult only when promise is resolved. 
    deferred.done(function(result){ 
     getResult(id, 'all'); 
    }); 
}); 
+0

Das sieht wie ein Fehler aus. 'defered.done()' wird aufgerufen, bevor 'getCountry' abgeschlossen wurde. – danh

+0

@danh die Absicht ist, dass es * verzögert * ist, bis getCountry fertig ist. obwohl es nicht genau klar ist. Wäre klarer, wenn 'getCountry' den Aufruf von $ .ajax zurückgibt und 'var dferred = getCountry (id)'. –

+0

Vermutlich gibt getCountry kein Ajax zurück, stattdessen werden mehr als ein Ajax-Aufruf ausgeführt. Entweder um alle Ajax-Aufrufe in getCountry zu einem einzigen Versprechen zu vereinen und zurückzukehren. Oder verzögerte Objekte in getCountry auflösen, wie ich es vorgeschlagen habe. Bitte korrigiere mich, wenn ich hier falsch liege. –

0

können Sie Deffered von jQuery verwenden. Um die Dokumente zu zitieren

versuchen Sie nach unten Code.

$(document).ready(function() { 

var id = $(this).attr('id'); 
getCountry(id).done(getResult(id, 'all')); 

}); 
function getCountry(id){ 
var dfd = $.Deferred(); 
// ur ajax calls and chains of onSuccessCalls 
//call `resolve` on the deferred object, once you're done 
Success: 
    dfd.resolve(); 

// return the Deferred Object  
return dfd; 
} 
+0

Ich habe Ihren Vorschlag ausprobiert. Ich bekomme einen * TypeError: getCountry() ist undefiniert * bezieht sich auf die Zeile mit 'getCountry (id) .done (getResult (id,' all ')); '. Ich habe dieses Problem nicht, wenn ich 'getCountry() 'alleine anrufe ... – wiltomap