Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> jak dokładnie działa abort() w jQuery?
SeaDog
post
Post #1





Grupa: Zarejestrowani
Postów: 42
Pomógł: 0
Dołączył: 15.11.2010

Ostrzeżenie: (0%)
-----


Witam, ostatnio napisałem post w dziale mysql (dublowanie zapytań SQL). W skrypcie był błąd, który został poprawiony i sytuacja się poprawiła,
ale ostatnio dostałem info od swojego klienta, że po wypełnieniu formularza znów dublują się zapytania w bazie danych MySQL.
Forumowicze, mam do Was pytanie.

Jak dokładnie działa funckja abort() w jQuery? Chodzi mi konkretnie o ustawiony timeout w Ajaxie i anulowaniu requestu w sekcji error.

Już tłumaczę o co mi dokładnie chodzi, otóż:

Użytkownik wypełnia formularz, jeśli wszystkie pola zostaną wypełnione a walidacja nie zwróci błędu do skryptu PHP leci ciąg JSON.
W metodzie AJAX ustawiony jest timeout na 3 sekundy. Po trzech sekundach od nie otrzymania success uruchamia się funkcja z informacją dla użytkownika,
że jego zlecenie jest przetwarzane (w tym momencie AJAX zwrócił error i ponawia wysłanie ciągu JSON do tego samego skryptu PHP w przeciągu
jednej sekundy i tak w kółko... aż do momentu wyrobienia się przeciągu 3 sekund, czyli AJAX success).

Wszystko zależne jest od obciążenia serwera. Jeśli obciążenie jest znikome, komunikat o przetważaniu dancyh nawet się nie włącza. Jeśli obciążenie jest
nieco wyższe, wtedy funckja uruchamia się po trzech sekundach. Bywa też tak, że komunikat się pokaże, po chwili zniknie a wpis się nie zdublował.
Głowię się już nad tym około tygodnia. Jak to wygląda w praktyce?

Czy możliwym jest, że wysłany ciąg JSON leci do serwera, w bazie kolejkowane są zapytania, minęły 3 sekundy, w tym momencie uruchamia się wyżej
opisana funckja i ponawiane jest to samo zapytanie mimo tego, że wpis już został prawidłowo dodany? czyli tak jakby funckja wykonuje się ponownie,
ponieważ AJAX nie zdążył zwrócic success?

Efekt ma być taki, żeby najpóźniej po 3 sekundach od kliknięcia w przycisk "Wyślij", jeśli skrypt jeszcze przetwarza dane ponieważ serwer jest obciążony,
użytkownik otrzymał odpowiednią informację, żeby nie pomyślał, że coś się zawiesiło albo coś podobnego. Myślałem, że użycie w tym wypadku
AJAX error jest dobrym rozwiązaniem ale zauważyłem, że pomimo 3 zabezpieczeń takich jak

- zdjęcie zdarzenia z przycisku po jego kliknięciu,
- przypisanie wartości zmiennej "s" = 1, która powoduje, że ponowny request nie może być wysłany. Wartość 0 wraca po otrzymaniu AJAX success,
- zabezpieczenie skryptu PHP sesją, która pozwala wysłać następne zlecenie dopiero po 5 sekundach

...nadal występuje problem z dulowaniem zleceń,

Proszę o pomoc.

Ten post edytował SeaDog 26.09.2014, 19:48:48
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
SeaDog
post
Post #2





Grupa: Zarejestrowani
Postów: 42
Pomógł: 0
Dołączył: 15.11.2010

Ostrzeżenie: (0%)
-----


Twojego rozwiązania nie testowałem. Myślałem, że otrzymam konkretną informację dlaczego tak się dzieje. Jak narazie nie będę wprowadzał kolejnych zmian,
ponieważ na chwilę obecną duplikatów nie ma od momentu, kiedy użyłem innego rozwiązania czyli, zamiast wyświetlać komunikat użytkownikowi kiedy Ajax
zwroci error po 3 sekundach i ponowić wysłanie danych, rozwiązałem to w ten sposób, że komunikat zwracany jest po 3 sekundach od momentu kliknięcia
w przycisk ale jako osobna funckja a timeout ustawiony jest na 15 sekund. W przypadku zwrócenia przez Ajax error, użytkownik musi kliknąć przycisk, żeby
ponownie wysłać dane.

Mniej więcej wygląda to taK;

  1. $(document).ready(function(){
  2.  
  3. var s=0;
  4.  
  5. function wait(){
  6.  
  7. $('button','#form').attr('disabled','disabled');
  8.  
  9. w=setTimeout(function(){
  10.  
  11. wai = 1;
  12.  
  13. $('#modal').dialog({
  14. autoOpen: 'true',
  15. modal: 'true',
  16. resizable: 'false',
  17. width: '30%',
  18. title: "Komunikat z serwera",
  19. show: { effect: "scale", direction: "origin" },
  20. hide: { effect: "scale", direction: "origin" },
  21. position: ['5%',120],
  22. closeOnEscape: 'false',
  23. });
  24.  
  25. $('.ui-dialog-titlebar-close').hide();
  26.  
  27. $('#modal').empty().css('text-align','center');
  28. $('#modal').html("<div style='width:100%;height:80px;background-position: center;background-repeat:no-repeat;background-image:url(\"images/loading.gif\")'></div>\
  29. Czekaj, trwa przetwarzanie informacji...");
  30.  
  31. }, 3000);
  32.  
  33. }
  34.  
  35.  
  36. var form_data = $('#form').serialize();
  37.  
  38. $('#form').submit(function(){
  39.  
  40. wai = 0;
  41.  
  42. wait();
  43.  
  44. function add(){
  45.  
  46. if(s<1){
  47.  
  48. s=1;
  49.  
  50. var req = $.ajax({type:"POST",url:"skrypt.php",dataType:"json",data:form_data,cache:false,timeout:15000,success:function(data){
  51.  
  52. if(wai>0){ $('#modal').dialog('close'); }
  53.  
  54. ...
  55.  
  56. clearTimeout(w);
  57. setTimeout(function(){s=0}, 5000);
  58.  
  59. },error:function(){
  60.  
  61. req.abort();
  62.  
  63. $('#modal').html("<b>Przekroczono limit czasu połączenia:</b><br><button type='submit' id='retry' class='btn btn-primary btn-large'>Spróbuj ponownie</button>");
  64.  
  65. $('#retry').one('click', function(){
  66.  
  67. $('#modal').dialog('close');
  68.  
  69. s=0;
  70. wai=0;
  71. wait();
  72. add();
  73.  
  74. });
  75.  
  76. }
  77.  
  78. });
  79.  
  80. }
  81.  
  82. }
  83.  
  84. add();
  85.  
  86. });
  87.  
  88. });


Ominięcie problemu, ale zagadka nadal nie jest rozwiązana...

Ten post edytował SeaDog 28.09.2014, 22:15:11
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 27.12.2025 - 07:22