Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Duża ilość callback w jQuery
Forum PHP.pl > Forum > Po stronie przeglądarki
eFK
Witam serdecznie

Piszę fragment kodu odpowiedzialny za poruszanie czterema obrazkami. Sprawa dokładnie wygląda tak: obrazek się pojawia, dzięki animate przesuwa na koniec jednego diva, zanika, pojawia w kolejnym, przesuwa na jego koniec, zanika ponownie, pojawia się w ostatnim div, gdzie przesuwa się na jego koniec i tam zostaje. A potem kolejny, kolejny i kolejny. Nie jest to trudny kod, ale aby wszytko działało w odpowiedniej kolejności używam callbacków. Przy jednym obrazku to nie problem, ale przy czterech ten kod zaczyna robić się zawiły, a to nie jest prawidłowe.

Zastanawiam się więc jak w jQuery zachowując kolejność wykonywanego kodu uniknąć dużej ilości callbacków?
Aqu
Promise / jQuery.Deferred pozwalają pisać w ten sposób:

  1. anim1()
  2. .then(anim2)
  3. .then(anim3)
by_ikar
Nie jest to problem samego jquery, tylko tego w jaki sposób działa javascript ogólnie. A działa asynchronicznie i ty chcesz żeby działał asynchronicznie, żeby jedna akcja drugiej nie blokowała. Dlatego też zostały wprowadzone obietnice (promise) oraz od całkiem niedawna generatory i ich async/await odpowiedniki. Dzięki czemu możesz tworzyć kod który wygląda jak synchroniczny, a jest asynchroniczny. Od jakiegoś czasu używam takiego podejścia (raczej głównie po stronie backendu) i jest to ogromny krok do przodu i już nigdy nie chcę używać callback'ów czy then'ów.
trueblue
Czy ta animacja powoduje modyfikacje drzewa DOM? Jeśli nie, tj. element pozostaje w tym samym miejscu w strukturze DOM podczas całej animacji, to może użyc animacje w CSS?
eFK
promis powinno być ok(wydawało mi się że jest przestarzały), ale po całym dniu studiowania nadal nie mogę go poprawnie użyć z moim kodem.
  1.  
  2. $(document).ready(function() {
  3.  
  4. var right=$('.a #first').width();
  5. var height=$('.a #first').height();
  6.  
  7.  
  8. $('.a #first').show('slow',function(){
  9. $('.a #first').animate({right:0},500,
  10. function(){$('.a #first').animate({width:0,height:height},500,
  11. function(){$('.b #first').css({'display':'block','height':height}).animate({width:right,height:height},500,
  12. function(){$('.b #first').animate({right:0},500,
  13. function(){$('.b #first').animate({width:0,height:height},500,
  14. function(){$('.c #first').css({'display':'block','height':height}).animate({width:right,height:height},500,
  15. function(){$('.c #first').animate({right:0},500)})
  16. })
  17. })
  18. })
  19. })
  20. })
  21. });
  22.  
  23. $('.a #first').promise().done(function(){
  24. $('.a #sec').show('slow',function(){
  25. $('.a #sec').animate({right:0},500,
  26. function(){$('.a #sec').animate({width:0,height:height},500,
  27. function(){$('.b #sec').css({'display':'block','height':height}).animate({width:right,height:height},500,
  28. function(){$('.b #sec').animate({right:0},500,
  29. function(){$('.b #sec').animate({width:0,height:height},500,
  30. function(){$('.c #sec').css({'display':'block','height':height}).animate({width:right,height:height},500,
  31. function(){$('.c #sec').animate({right:right},500)})
  32. })
  33. })
  34. })
  35. })
  36. })
  37. })
  38. });
  39.  
  40. $('.a #sec').promise().done(function(){
  41. $('.a #third').show('slow',function(){
  42. $('.a #third').animate({right:0},500,
  43. function(){$('.a #third').animate({width:0,height:height},500,
  44. function(){$('.b #third').css({'display':'block','height':height}).animate({width:right,height:height},500,
  45. function(){$('.b #third').animate({right:0},500,
  46. function(){$('.b #third').animate({width:0,height:height},500,
  47. function(){$('.c #third').css({'display':'block','height':height}).animate({width:right,height:height},500,
  48. function(){$('.c #third').animate({right:2*right},500)})
  49. })
  50. })
  51. })
  52. })
  53. })
  54. })
  55. });
  56.  
  57. $( '.a #third').promise().done(function(){
  58. $('.a #fourth').show('slow',function(){
  59. $('.a #fourth').animate({right:0},500,
  60. function(){$('.a #fourth').animate({width:0,height:height},500,
  61. function(){$('.b #fourth').css({'display':'block','height':height}).animate({width:right,height:height},500,
  62. function(){$('.b #fourth').animate({right:0},500,
  63. function(){$('.b #fourth').animate({width:0,height:height},500,
  64. function(){$('.c #fourth').css({'display':'block','height':height}).animate({width:right,height:height},500,
  65. function(){$('.c #fourth').animate({right:2*right},500)})
  66. })
  67. })
  68. })
  69. })
  70. })
  71. })
  72. });
  73. })
  74.  
  75.  


W tym przypadku pierwsza i druga część kodu działa poprawnie, asynchronicznie, ale potem zaczynają się problemy. Dwa ostatnie etapy niestety już wyświetlają się razem. Przy próbach użycia then w ogóle cały czas były błędy. Przy podzieleniu tego na cztery funkcje i też był problem przy trzecim i czwartym etapie. Może podpowiecie coś jeszcze.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.