2012-09-20 2 views
13

Ich habe 2 Ajax-Aufruf in 2 Differenzfunktionen. Ich möchte .click verwenden, um diese 2 Funktionen aufzurufen. Der func1 fügt Daten in die Datenbank ein, dann wird func2 die Daten abrufen, so dass meine Frage ist, wie man wartet bis der func1 vollständig ist, dann führt er nur den func2 aus.Jquery weiterhin eine Ajax-Funktion, nachdem der erste Ajax-Funktionsaufruf vollständig abgeschlossen ist

Ich versuchte .delay(), es funktioniert, aber ich denke, das ist eine dumme Lösung.

$("#updateLocation").click(function(e){ 
     e.preventdefault; 
     func1(); 
     func2(); 
     }); 
     return false; 
    }); 

    function func1(){ 
     $.ajax({ 
     url:'', 
     }); 
}); 

    function func2(){ 
     $.ajax({ 
     url:'', 
     }); 
}); 

Antwort

23

Drei Möglichkeiten:

Anruf func2 auf Erfolg func1:

function func1() { 
     $.ajax({ ... }).done(func2); 
    } 

Verwenden Deferred API func2 zu rufen, wenn flippige erhält:

e.preventDefault(); 
    $.when(func1).then(func2); 

Fabrikat func1 Synchron (nicht empfohlen):

function func1() { 
     $.ajax({url: '', async: false}); 
    } 
+1

Ich liebe immer, diese Art von Antwort, die mit Optionen – vzhen

+0

Wie @vzhen sagte .Dieses Verfahren ist gut – iCoders

+0

eine leichte Variation Sie 2 unabhängige Ajax haben Anrufe, die Sie wollen einfach nur Asynchron aber dann wollen Sie ein drittes starten, wenn beide abgeschlossen haben, die sein '$ .when (func1, func2) sollte .then (func3);' – MikeT

1

Sie können die Option "async" auf false setzen (für den ersten Ajax-Aufruf).

Dies bedeutet, dass die Funktion 2 aufgerufen wird, nachdem Funktion 1 eine Antwort erhalten hat, d. H. Ihre Ausführung beendet ist.

function func1(){ 
     $.ajax({ 
     url:'', 
     async: false 
     }); 
}); 
+0

Beachten Sie, dass dies zu tun Ihre gesamte Skript pausiert und führen sie zu ‚hängen‘, bis die (jetzt synchron) Vorgang abgeschlossen ist! –

+0

Nur eine Anmerkung hier: Es ist lange her, seit diese Antwort und AJAX async: false Option ist jetzt veraltet. – wondersz1

3

Verschieben func2 innen func1-> AJAX> succes Rückruf

$("#updateLocation").click(function(e) { 
    e.preventdefault; 
    func1(); 
    //func2(); 
}); 
return false; 
}); 

function func1() { 
    $.ajax({ 
     url: '', 
     success: function() { /* other stuff */ 
      func2(); 
     } 
    }); 
}); 

function func2() { 
    $.ajax({ 
     url: '', 
    }); 
}); 
2

Anruf fun2 in Erfolg func1

function func1(){ 
    $.ajax({ 
    url:'', 

    success:function(){ 
     func2(); 
    } 
    }) 
4

Da Ajax Anrufe asynchron sind, wird die Anwendung nicht 'Pause' bis ein Ajax-Anruf ist abgeschlossen und einfach sofort den nächsten Anruf starten.

JQuery bietet einen Handler, der aufgerufen wird, wenn der Anruf erfolgreich war, und einen anderen, wenn während des Anrufs ein Fehler auftritt.

$.ajax({ 
    url: 'ajax/test.html', 
    success: function(data) { 
    $('.result').html(data); 
    alert('Load was performed.'); 
    }, 
    error :function(jqXHR, textStatus, errorThrown) 
    { 
    alert("something went wrong"); 
    } 
}); 

Sie wollen Ihre zweite AJAX-Funktion aus der Erfolg Handler aufrufen.

+1

Dies ist die einfachste Form ...! – Si8

0

Sie könnten auch Ihre Funktion als Parameter wie folgt passieren:

var secondFunc = function (func) { 

    //Do ajax req or smt 
    func("answer", "params"); 

}; 
var firstFunc = function() { 

    secondFunc(
     function (answerFromFunc2, paramsFromfunc2) { 

      var a = answerFromFunc2; 
      var b = paramsFromfunc2; 

     } 
    ); 

    //Do smt after the function request to the server is done 
    var doSmt = "another func or variable"; 

}; 
firstFunc(); 
Verwandte Themen