2010-12-06 11 views
7

Ich bin durchschleifen mehrere Elemente und eine Ajax-Anfrage für jeden von ihnen (mit jQuery). Ich möchte, dass sie unabhängig ausgeführt werden, aber in das DOM in der Reihenfolge auffüllen, in der sie aufgerufen wurden, nicht in der Reihenfolge, in der sie zurückgegeben werden (aus irgendeinem Grund dauern einige Anforderungen länger als andere). Irgendwelche Tipps zur Best Practice für diese Art von Ding?Pflegen Reihenfolge der Anfragen, wenn Sie mehrere Ajax Callbacks

+0

befestigen haben eine Anfrage Ordnung Feld für jeden und die in einem globalen Bit-Speicher gespeicherten Daten (vielleicht zu einem „Halte div“ anhängen) und in jedem Erfolg Anruf ein Gemeinsames Modul, das versucht, alle zu laden, wenn alle erfolgreich waren. Klingt, als würdest du ziemlich viele Mutexe haben, um Muster für dieses Design zu halten. ~~ Wie für die beste Praxis halten Sie einfach den Code sauber und lesbar. – jcolebrand

Antwort

1

Sie könnten alle Erfolgsergebnisobjekte an eine Warteschlange senden. Haben Sie einen Index, der mit der ursprünglichen Anforderung gesendet wurde, und überprüfen Sie diese Warteschlange fortlaufend auf den nächsten Index.

Aber im Allgemeinen erlauben Browser nur zwei simultane Ajax-Anfragen, so dass es sich lohnen könnte, einfach die nächste Ajax-Anfrage nach dem Erfolg der vorherigen Anfrage zu senden.

Hier ist ein Start beim Code:

var results = {}, lastProcessedIndex = 0; 
var totalLength = $('a.myselector').each(function(el, index){ 
    $.ajax({ 
     url: $(this).attr('href'), 
     success: function(result){ 
      results[index] = result; // add to results object 
     } 
    }); 
}).length; 

var intervalId = setInterval(function(){ 
    if(results[lastProcessedIndex]){ 
     // use object 
     lastProcessedIndex++; 
    } 
    else if(totalLength == lastProcessedIndex){ 
     clearInterval(intervalId); 
    } 
}, 1000); // every 1 second 
+0

Ja, ich habe auch diesen jQuery Ajax-Warteschlangenmanager gefunden, was meiner Meinung nach im Grunde das ist, was Sie hier beschreiben: http://www.protofunc.com/scripts/jquery/ajaxManager/ – Chris

0

Ich werde mit diesem einen Stich in der Dunkelheit nehmen, aber es könnte helfen. Vielleicht könnten Sie ein globales Pufferarray erstellen und dann, wenn der AJAX zurückkehrt, können Sie das Ergebnis dem Puffer hinzufügen. Sie könnten dann einen Timer einrichten, der nach dem Auslösen den Inhalt des Puffers überprüft. Wenn sie in Ordnung sind, wird es entsprechend ausgegeben.

8

Nun, die Ergebnisse können in irgendeiner undefinierten Reihenfolge zurückkommen, sie sind asynchron und unterliegen den Launen des Internets und der Server.

Was Sie tun können, ist das Problem auf die gleiche Weise behandeln TCP tut über UDP. Sie verwenden Sequenzbezeichner.

Halten Sie eine Sequenzidentifikation bereit und erhöhen Sie sie jedes Mal, wenn Sie eine Anfrage senden. Wenn Anfragen zurückkommen, überprüfen Sie sie in der richtigen Reihenfolge und verarbeiten sie nur so, wie sie eintreffen. Führen Sie eine Liste der zurückgegebenen Daten in der richtigen Reihenfolge und lassen Sie sie nach jeder Aktualisierung regelmäßig überprüfen. Wenn das erste erwartet wird, sollte es die gesamte Liste bis zur ersten Lücke verarbeiten.

Bedenken Sie, dass Sie eine Anforderung verlieren könnten, daher wäre ein passendes Timeout vor der Ignorierung einer gegebenen Sequenzidentifikation angebracht.

Verwandte Themen