2010-08-04 8 views
6

Ich habe eine bestimmte Funktion, die ich einmal ausführen möchte und erst nach dem Abschluss mehrerer AJAX-Anfragen.Auslösen einer Funktion erst nach dem Abschluss mehrerer AJAX-Anfragen

Meine aktuelle Lösung sieht ein bisschen wie folgt aus:

function doWork() { 
    //This is the function to be run once after all the requests 
} 

//some tracking/counting variables 
var ajaxDoneCounter = 0; 
var numOfAjaxRequests = 5; 
var workDone = false; 

function doWorkTrigger() { 
    ajaxDoneCounter++; 
    if(!workDone && ajaxDoneCounter >= numOfAjaxRequests) { 
     workDone = true; 
     doWork(); 
    } 
} 

// ... 

//and a number of ajax requests (some hidden within functions, etc) 
//they look something like this: 
$.ajax({ 
    url: "http://www.example.com", 
    dataType: "json", 
    success: function(data) { 
     //load data in to variables, etc 
     doWorkTrigger(); 
    } 
}); 

Eine offensichtliche Gefahr in der oben ist, dass jeder AJAX-Aufruf, der nicht erfolgreich ist, wird ajaxDoneCount nicht erhöht und so doWork() wird wahrscheinlich nie genannt werden. Ich kann das mit dem error Callback innerhalb von jedem $.ajax umgehen, so dass mich das nicht zu sehr beunruhigt.

Was ich wissen möchte ist, ob das oben genannte sicher und/oder gute Praxis ist?
Gibt es einen Trick, den ich verpasst habe, oder irgendetwas anderes, das besser funktionieren könnte?

+1

Das, was ich vorgeschlagen hätte, tun Sie aus dem Lesen der Problembeschreibung. Ich bin mir nicht sicher "Ich kann mir nichts Besseres vorstellen" ist eine passende "Antwort", obwohl ich stattdessen nur kommentiere. ;-) – Chris

Antwort

6

Update: Seit jQuery 1.5, deferred objects[docs] bieten eine sauberere Lösung. Have a look at an example here.


ich .ajaxComplete() verwenden würde, wird es ausgelöst werden, wenn ein Anruf beendet Ajax (Erfolg oder Fehler):

var numOfAjaxRequests = 5; 

$(document).ajaxComplete(function() { 
    numOfAjaxRequests--; 
    if(!numOfAjaxRequests) { 
     doWork(); 

    } 
}); 

Dann gehst du nicht jede Ajax-Anfrage bearbeiten müssen.

Sie sogar .ajaxSend() nutzen könnten, um zu starten Ajax-Anfragen benachrichtigt, anstatt es zu hartzucodieren (aber ich bin nicht sicher, ob das wirklich funktioniert, vielleicht werden Sie Rennbedingungen erleben):

var numOfAjaxRequests = 0; 

$(document).ajaxSend(function() { 
    numOfAjaxRequests++; 
}); 
+0

Ah, gut zu wissen - aber was ist, wenn ich zwei Sätze von Ajax-Anrufen habe, die jeweils eine getrennte Funktion auslösen (ich weiß nicht, ich frage mich nur). Würde diese Methode mir erlauben, die zwei Sätze zu trennen, so dass beide Funktionen nicht warten, bis beide Gruppen beendet sind? – DMA57361

+0

@ DMA57361: Schauen Sie sich die Dokumentation an.Die XMLHttpRequest und die Optionen des Ajax-Aufrufs werden an den Callback übergeben. Möglicherweise können Sie die Anrufe mit diesen Informationen unterscheiden. In der Dokumentation ist ein Beispiel, dass der Rückruf nur ausgeführt wird, wenn der Ajax-Aufruf an eine bestimmte URL war. –

+0

Sieht gut aus für mich, denke, ich werde dort eine gute Lektüre des Docs machen und diese zwei ein bisschen weiter untersuchen. Vielen Dank. – DMA57361

0

I don‘ Wissen Sie genug über JavaScript-Interna, aber es besteht die Gefahr, dass die Operation:

ist nicht atomar. Wenn dies der Fall ist, könnte dies einer Wettlaufsituation unterliegen.

+0

Warum der Downvote? Wenn ++ in JavaScript atomar ist, dann poste einen Kommentar darüber. Meine schnelle Recherche nach dem Posten der Antwort scheint anzuzeigen, dass ECMAScript nicht erklärt, ob ++ atomar ist oder nicht. –

+0

Ich wunderte mich auch über -1, und ich habe [diese] (http://stackoverflow.com/questions/1663125/is-javascript-multithreaded) Frage gefunden, die darauf hinweist, dass JavaScript nur als ausgeführt wird single thread, also wird es wahrscheinlich die Ajax-Callbacks anstellen, wenn sie fertig sind - was bedeutet, dass dieses spezielle Problem nicht relevant ist. Dennoch wäre es hilfreich gewesen, wenn jemand, der Downvote gemacht hätte, sich die Mühe gemacht hätte, uns das zu sagen ... – DMA57361

+0

Ja, und der Kommentar unter http://stackoverflow.com/questions/1663125/is-javascript-multithreaded/1663578#1663578 zeigt an, dass es nicht immer so sein kann. –

1

Ich denke, Sie sollten complete(XMLHttpRequest, textStatus) Ajax-Ereignis anstelle von Erfolg verwenden (Daten, textStatus, XMLHttpRequest).

Nach jQuery Hilfe:

complete(XMLHttpRequest, textStatus) 

Eine Funktion, die aufgerufen werden, wenn die Anfrage beendet (nach Erfolg und Fehler Rückrufe ausgeführt werden). Die Funktion erhält zwei Argumente: Das XMLHttpRequest-Objekt und eine Zeichenfolge , die den Status der Anforderung beschreibt. Dies ist ein Ajax-Ereignis.

Verwandte Themen