2011-07-02 18 views
5

Mam następujący kod:Jak jQuery funkcje sekwencyjne

$(document).ready(function() { 
    loadStuff(someURL, someID); 
    showStuff('foo'); 
}); 

showStuff() opiera się na treści generowanej przez loadStuff(), ale wydaje się, jakby showStuff() jest falstart przed wspomnianym treść jest dostępna . Jak zmusić ich do sekwencyjnego uruchamiania?

Aktualizacja: Tak, w loadStuff są wywołania ajaxowe, ale niestety są to jsonp, więc nie można ich nazwać synchronicznie.

Odpowiedz

6

przepisać jako:

$(document).ready(function() { 
    loadStuff(someURL, someID, function() { showStuff('foo'); }); 
}); 

gdzie trzeci parametr loadStuff jest wywołania zwrotnego do połączenia po jego zawartość jest ładowana

+0

Yeah! Dokładnie to, czego szukałem. Wielkie dzięki. – MizzJop

0

Robią run sekwencyjnie, ale rzeczy wewnątrz loadStuff nie może być (zwłaszcza jeśli loadStuff wykonuje asynchroniczny HTTP żąda). Jest to kod wewnątrzloadStuff który nie jest uruchamiany sekwencyjnie.

Zazwyczaj ja po prostu powiedzieć „musimy sposób więcej kontekstu kodu aby odpowiedzieć na to pytanie”, ale nie na tyle, aby powiedzieć:

Albo użyć żądania HTTP synchroniczny lub przenieść rozmowę do showStuff do wywołanie zwrotne na żądanie dla twojego asynchronicznego, tak że odpala ono tylko po zakończeniu żądania.

6

elegancki sposób wykorzystuje jQuery.Deferred, zwłaszcza Deferred.pipe. Zobacz przykład Understanding jQuery Deferred.pipe() dla przykładu.

+0

Tak, to zdecydowanie dobry sposób robienia tego. http://www.erichynds.com/jquery/using-deferreds-in-jquery/ wyjaśnia to ładnie. Jedynym haczykiem jest użycie Jquery 1.5 lub wyżej – rajasaur

+0

Ostrzeżenie: od wersji jQuery 1.8 metoda [deferred.then()] (http://api.jquery.com/deferred.then/) (...) zastępuje obecnie wycofaną metodę deferred.pipe() – T30

0

Można:

Przełęcz showStuff jako delegat do zwrotnego powoływać się na udanej odpowiedzi od rozmowy AJAX w loadStuff().

Przykład:

function loadStuff() { 

     $.ajax({ 
     url: "Stuff/GetStuff", 
     success: function(){ 
     showStuff(); 
     } 
    }); 

} 

Lub mniej elegancki sposób, po prostu sprawdzić, czy dane są ładowane tak często, aż będzie:

var timerId = setInterval(showStuff, 50); 

function showStuff() { 
    if (stuffIsLoadded) { 
    // do show stuff stuffs. 
    clearInterval(timerId); 
    } 
} 
Powiązane problemy