Wie durchlaufen Sie Ajax-Anfragen in einem JQuery Wann - Dann Statement?

8

Ich versuche, eine Menge Daten von einem API Async zu laden, und wenn alle Daten geladen sind, möchte ich ein Ereignis auslösen, dass alle Daten geladen sind. Das Problem, das ich habe, ist, dass die API, die ich verwende, die Anzahl der Antwortobjekte auf fünf beschränkt. Und ich müsste möglicherweise 30-40 Antwortobjekte abrufen.

Ich möchte also eine when-then-Anweisung erstellen, die die Datenelemente durchläuft und alle fünf Elemente anfordert. Wenn alle Elemente geladen sind, möchte ich ein geladenes Ereignis auslösen. Das Problem, das ich habe, ist, dass die When-Than-Anweisung vor dem Erfolg der Ajax-Anfrage abgeschlossen wird.

auf den Code, den ich versucht habe.

%Vor%

Die loadJSONTOData-Funktion ist im Grunde nur eine Wrapper-Funktion für ein Async $ .ajax.

Ja, das Ereignis wird ausgelöst, bevor die Daten tatsächlich geladen werden. Auch aus irgendeinem Grund, wenn ich versuche, für die Schleife direkt in die When einzufügen (sagen Sie es durch einen Syntaxfehler?

Hat jemand einen Ratschlag, wie ich eine Menge Ajax-Anfragen stellen und warten könnte, bis sie alle erfüllt sind, bevor ich ein Ereignis auslöst? Oder einen Weg, um zu reparieren, was ich gerade habe?

Vielen Dank im Voraus für die Hilfe.

    
recneps 25.08.2013, 01:08
quelle

2 Antworten

17

Es ist möglich zu tun, was du verlangst. Der Server, an den Sie Ihre Anforderungen senden, hat jedoch wahrscheinlich einen Grund für das von ihnen erzwungene Limit. Als jemand, der in der Webentwicklung arbeitet und aus erster Hand gesehen hat, wie lästig DDOS, Scraping und anderer Missbrauch von APIs sein kann, würde ich vorschlagen, ihr Limit einzuhalten.

Davon abgesehen, hier ist, wie Sie es tun können.

$. ajax gibt tatsächlich ein verzögertes Objekt zurück, so dass Sie es zu Ihrem Vorteil verwenden können. Auch $ .when kann eine beliebige Anzahl von verzögerten Objekten akzeptieren. Die Kombination dieser beiden Fakten kann Ihr Problem lösen.

%Vor%

Beachten Sie, dass dies keine Wettlaufbedingung ist. Obwohl $ .ajax asynchron ist, ist $ .each nicht, daher wird Ihre Liste der Deferreds die Gesamtliste sein, bevor Sie zu $ ​​.when kommen und $ .then / $. Fail / $. Immer nur dann ausgelöst wird, wenn sie alle abgeschlossen sind .

EDIT: Ich habe vergessen, die Aufteilung um 5s zu addieren, aber dies illustriert die allgemeine Idee. Sie können wahrscheinlich von hier aus herausfinden, wie Sie es auf Ihr Problem anwenden können. Übrigens könnten Sie einfach array.splice (0,5) verwenden, um die nächsten 5 Ergebnisse aus dem Array zu erhalten. .splice ist sicher zu verwenden; Wenn die Gesamtzahl der Elemente weniger als 5 ist, werden nur die restlichen Elemente übernommen.

    
tandrewnichols 25.08.2013, 02:25
quelle
1

Sie können Async.js libray verwenden. und probiere die Funktion aus.

    
Jake Lin 25.08.2013 01:21
quelle

Tags und Links