2014-05-23 15 views
8

Nie jestem pewien, czy jest to możliwe i jak to zrobić. Korzystam z następujących w odpowiedzi $ .ajax, który działa idealnie dobrze, jednak muszę zadzwonić do funkcji loadSlider(); PO zakończeniu pętli iteracji.wywołanie zwrotne do funkcji po zakończeniu .each()?

if (response.success) 
{ 
    $.each(response.screenshots, function(index, value) { 
     //add the slide 
     $('#slider1').prepend('<li data-id="'+value.screenshot_id+'"><img src="/showimage.php?show='+value.image_filename+'" alt=""></li>'); 
     //add the pager 
     $('#rslides-pager').prepend('<li><a href="javascript:;"># here</a></li>'); 
    }); 

    //want to call loadSlider(); AFTER everything above is completed       
} 
+1

więc można zadzwonić po każdym zamknięciu '' '')} ​​ –

+2

Whats problemu? Możesz to nazwać. – Satpal

+0

To jest ajax - czy nie stanie się to asynchronicznie, zanim skończy się każdy z nich? – user756659

Odpowiedz

25

$.each() iteracje nad tablicy synchronicznie, więc może po prostu uruchomić swój kod po wywołaniu $.each();.

if (response.success) { 
    $.each(response.screenshots, function(index, value) { 
     // do stuff 
    }); 

    loadSlider(); 
} 

Jak wspomina AJAX: Tylko rzeczywista zwrotna sukces (czyli funkcja, która najprawdopodobniej zawiera kod, który pisał) jest wykonywane asynchronicznie. Dowolny kod wewnątrz tej funkcji działa synchronicznie (chyba że w tym miejscu wywołasz inną funkcję asynchroniczną).

+1

Nie wiedziałem, że ... nawet nie pomyślał, aby spróbować, ponieważ założyłem asynchroniczne. Dzięki! – user756659

+0

Lol samo stało się ze mną ... Dzięki, że zadałeś już to pytanie. – Sanuj

-1

można uruchomić suwak w ostatniej iteracji, to proste:

if(response.success) 
{ 
    var count = response.screenshots.length; 
    $.each(response.screenshots, function (index, value) { 
     //add the slide 
     $('#slider1').prepend('<li data-id="' + value.screenshot_id + '"><img src="/showimage.php?show=' + value.image_filename + '" alt=""></li>'); 
     //add the pager 
     $('#rslides-pager').prepend('<li><a href="javascript:;"># here</a></li>'); 
     if (!--count) { 
      //want to call loadslider(); after everything above is completed       
      loadslider(); 
     } 
    }); 
} 
-1

jQuery ma jQuery.when(), to stanowi sposób wykonywania funkcji zwrotnych opartych na zero lub więcej przedmiotów, zazwyczaj przedmiotów odroczony reprezentujące zdarzenia asynchroniczne.

jquery $.when reference

Teraz w kodzie Być może:

if (response.success) { 
    var iterate = $.each(response.screenshots, function(index, value) { 
     // do stuff 
    }); 

    $.when(iterate) 
    .then( loadSlider, myFailure); 

} 

Pierwszą funkcją jest na sukces zwrotnego, a druga funkcja jest nie oddzwanianie.

-2
$.each(response.screenshots, function(index, value) { 

    }).promise().done(function() { 
      //Completed 
}); 

Próbka:

if (response.success) 
{ 
    $.each(response.screenshots, function(index, value) { 
     //add the slide 
     $('#slider1').prepend('<li data-id="'+value.screenshot_id+'"><img src="/showimage.php?show='+value.image_filename+'" alt=""></li>'); 
     //add the pager 
     $('#rslides-pager').prepend('<li><a href="javascript:;"># here</a></li>'); 
    }).promise().done(function() { 
      //Completed 
     }); 


} 
+0

Metoda łańcucha obietnic nie działa z $ .each. – drmartin

Powiązane problemy