2009-10-09 15 views
10

mam prostą funkcję JavaScript:Siła wywołanie funkcji JavaScript poczekać, aż poprzedni zakończeniu

makeRequest(); 

Robi kilka rzeczy i umieszcza sporo zawartości do DOM.

robię kilka połączeń tak:

makeRequest('food'); 
makeRequest('shopping'); 

one jednak zarówno ogień tak szybko, że są one natrafienia na siebie nawzajem palcami. Ostatecznie potrzebuję go, aby mieć funkcjonalność.

makeRequest('food'); 
wait.... 
makeRequest('shopping'); only if makeRequest('food') has finished 

Myślisz o tym, żeby wykonać je tylko po jednym na raz?

Dzięki!

+2

Wykonują tylko jeden na raz. Musi być coś wewnątrz tych funkcji, które wykonuje się asynchronicznie - może jest to żądanie AJAX? – Kylotan

+1

Tak, masz rację. Czy jest coś, co mogę zrobić? – mwilliams

Odpowiedz

15

Jeśli te funkcje faktycznie wykonują żądanie AJAX, lepiej zachować je asynchronicznie. Możesz wykonać synchroniczne żądanie AJAX, ale to zatrzyma przeglądarkę od odpowiedzi i prowadzić do złego doświadczenia użytkownika.

Jeśli to, czego potrzebujesz, jeśli żądania AJAX są tworzone jeden po drugim, ponieważ zależą od siebie nawzajem, powinieneś zbadać swoją funkcję, aby sprawdzić, czy zapewnia mechanizm zwrotny.

makeRequest('food', function() 
{ 
    // called when food request is done 
    makeRequest('shopping'); 
}); 

jQuery, wygląda na coś takiego

$.get("/food", function(food) 
{ 
    // do something with food 

    $.get("/shopping", function(shopping) 
    { 
     // do something with shopping 
    }); 
}); 
+0

+1 To jest droga. – ChaosPandion

+0

Podejście bliżej. Próbowałem twój pierwszy przykład i makeRequest z zakupów nie jest wywoływana. Mogę rzucić alarm i nie zostanie on uruchomiony albo – mwilliams

+0

To znaczy, że zrobiłeś coś złego. Dlaczego nie opublikujesz tego, co zrobiłeś? – ChaosPandion

1

Polecam, po prostu zapisać je asynchronicznie - na przykład wywołać makeRequest ('zakupy'); od obsługi zakończenia AJAX pierwszego połączenia.

Jeśli nie chcesz, aby napisać kod asynchronicznie, patrz Javascript Strands

1

Przypuszczam, że masz sposób wywołania zwrotnego, która dba o odpowiedzi na żądanie? Kiedy już to zrobi, pozwól mu na kolejną prośbę.

Zadeklaruj tablicę na kolejkę, a flagę śledzić status:

var queue = [], requestRunning = false; 

W metodzie makeRequest:

if (requestRunning) { 
    queue.push(requestParameter); 
} else { 
    requestRunning = true; 
    // do the request 
} 

W metodzie zwrotnej, po opiekę nad odpowiedź:

if (queue.length > 0) { 
    var requestParameter = queue.splice(0,1)[0]; 
    // do the request 
} else { 
    requestRunning = false; 
} 
+0

Bardzo dobrze, tego właśnie potrzebowałem.Można łączyć z metodą tutaj: http://answers.yahoo.com/question/index?qid=20120102010000AA1olc1 – alexk

0

Jeśli chcesz wykonać kilka żądań, wykonaj sekwencję, zobacz Peter Baker's answer na podobne moje pytanie.

Powiązane problemy