2010-11-23 6 views
1

Hey, Ich arbeite an einer jQuery each() - Schleife, die eine Ajax-Anfrage und eine setTimeout enthält. Das gibt mir einige Probleme mit dem Programmablauf.Ausführen einer Funktion, nachdem jede Schleife abgeschlossen wurde

xml_queries: function (data) { 
    var values = []; 

    // ... 

    $.each(data, function(index, value) { 

     // ... 

     // Start xml query 
     var i = 0; 
     get_data(value.value); 

     function get_data(value) { 
      $.ajax({ 
       type: 'POST', 
       url: '/admin/scanner/get_music_data/' + value, 
       dataTaype: 'json', 
       success: function(response) { 
        if (response === 'FALSE') { 
         // Start recursion - up to 3 Retries 
         if (++i <= 3) { 
          setTimeout(function() { 
           get_data(); 
          }, 100); 
         } else { 
          // ... 
         } 
        } else { 
         values.push(response); 
        } 
       } 
      }); 
     } 
    }); 
    // return values; 
    console.log(values); 
} 

Mein Problem ist, dass die console.log() in der letzten Zeile sofort ausgelöst wird (während der Schleife noch Datenverarbeitung ist). Gibt es keine einfache Möglichkeit, auf die Schleife zu warten? \:

Mit freundlichen Grüßen!

+0

Es ist das übliche Ajax-is-Asynchron-Problem. Es gibt eine Menge Fragen zu SO in diesem einen oder anderen Geschmack. –

Antwort

1

Basierend auf dem aktuellen Code, der direkteste Weg wäre $, auf false async Option setzen .ajax die eine synchrone Anforderung zu erzwingen, so dass JavaScript zu warten, bis es vor dem Fortfahren füllen Sie die nachfolgenden Anweisungen auszuführen (es gewann t tun dies für asynchrone Anfragen).

$.ajax(
    { 
    type: 'POST', 
    async: false, 
    ... 

Das wird Ihren Browser für die Dauer jeder Anfrage (yuck) blockieren. Ein andere Möglichkeit, es zu tun wäre, um Ihre Anwendung neu zu gestalten, so dass der nächste Ajax-Aufruf aus dem Erfolg Rückruf der ersten genannt wird, z.B .:

$.ajax(
    { 
    type: 'POST', 
    ... 
    success: function() { 
     doAjaxThingie(); 
    } 
+1

Besser wäre es noch, das asynchrone Verhalten zu erklären - aber ich blute 'sick_ dieser Fragen. –

+0

Vielen Dank, das war ganz einfach. Bei meinen Versuchen, nach einer Lösung zu suchen, habe ich gelesen, dass setTimeout dieses Problem verursachen würde. BTW: Wird die synchrone Verarbeitung von mehreren Threads durchgeführt? –

+0

@Matt - fair genug. Ich habe das mindestens sechs oder sieben Mal beantwortet. Einer der Gründe, warum es immer wieder aufkommt, ist, denke ich, weil die Formulierung einer solchen Frage sehr inkonsequent ist, sie scheinen durch Googeln schwer zu finden. Vielleicht sollten wir eine Richtlinie auf SO setzen, wobei sie das zusätzliche Tag 'asynchrony' bekommen :) – karim79

Verwandte Themen