2016-05-23 6 views
-1

Es gibt ein paar Fragen dieser genauen Art bereits gefragt. Einer von denen erhielt keine Antwort, von denen einer genau das vorschlug, was ich versuche, ohne Erfolg.Wie zu bestimmen, wenn mehrere Ajax Callbacks abgeschlossen sind

Hier ist, was ich tun zu wollen:

Funktion a() wird 1 bis mehrfach aufgerufen werden. Die Funktion b() führt einen Async-Aufruf aus.

for (i=0; i<=something; i++) { 
     function a() { 
      function b(); //makes async call 
     } 
    } 

// at this point, execution continues, 
// even though all function b()'s async 
// calls are still "pending". 

Wegen des async Aufrufs in Funktion b() Funktion a() selbst ist, für alle praktischen Zwecke auch Async.

Ich brauche eine Art zu wissen, wenn alle async-Aufrufe der Funktion b() abgeschlossen sind.

Ich versuchte dies:

var callCount=0; 

for (i=0; i<=something; i++) { 
    function a() { 
     callCount++; 
     function b(callCount); 
    } 
} 

I Funktion b() 's Asynchron-Callback-Funktion Dekrement Callcount, und tun dies dann haben:

var callCount=0; 

for (i=0; i<=something; i++) { 
    function a() { 
     callCount++; 
     function b(callCount); // b()'s callback decrements callCount by 1; 
    } 
} 

while (callCount > 0) { 
} 

// now continue 

Aber am Ende der für() Schleife, CallCount enthält immer noch die Anzahl der Aufrufe und dekrementiert nie, was zu einer Endlosschleife führt.

Ist callCount unveränderlich in b() Callback-Funktion?

Gibt es eine Möglichkeit zu erkennen, wenn eine Vielzahl von Async-Anrufen abgeschlossen wurden? Ich benutze sowohl jquery .ajax() und .get().

+1

Lesen Sie weiter zu [Versprechungen] (http://www.html5rocks.com/en/tutorials/es6/promises/) und [Zurückgestelltes Objekt] (https://api.jquery.com/category/deferred -Objekt) – AldoRomo88

+0

@ AldoRomo88. Beeindruckend! Ich habe beide kurz hintereinander gegeben, und ich bin jetzt total eingeschaltet, Mann! Vor allem bei deferredObject, da es in jQuery ist, gibt es Polyfill für ältere Browser! Was ist mit Versprechen? Wie sieht die Unterstützung von browswer im Moment aus? Danke für die Richtung. Es wird definitiv helfen, wenn es einfach keine Möglichkeit gibt, das zu tun, was ich versuche. –

+1

Siehe die Browser Kompatibilitäts-Tabelle am Ende von https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise – Barmar

Antwort

1

Nach Versprechungen und latente Einführung ... alles, was Sie brauchen, ist eine Reihe von Versprechen zu halten und .when $ verwenden und

$.when.apply($, promises).then(function() { 
    console.log('All ajax calls completed'); 
}); 

Bitte sich diese working fiddle, öffnen Sie einfach Ihre Konsole anwenden.

+0

Wenn ich dieses Array in Funktion b(), wie behalte ich es zwischen den Anrufen? Wenn ich es in Funktion a() setze, wie stelle ich es der Funktion b() zur Verfügung? @ AldoRomo88. –

+0

Wissen, ich denke, dass Sie Verschlüsse verstehen müssen, lesen Sie diese Artikel http://www.w3schools.com/js/js_function_closures.asp https://developer.mozilla.org/en-US/docs/ Web/JavaScript/Closures http://javascriptissexy.com/understand-javascript-closures-with-ease/ – AldoRomo88