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 |
|
|
|
![]() |
Post
#2
|
|
|
Grupa: Zarejestrowani Postów: 6 809 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%)
|
Myślałem, że otrzymam konkretną informację dlaczego tak się dzieje. Trudno dawać konkretną odpowiedź mając w tym przypadku "suchy" kod. Metoda abort nie zapewnia przerwania komunikacja z serwerem, bo może być również wykonana w momencie kiedy XMLHttpRequest ma status "done". Wtedy nie jest wywoływane zdarzenie onreadystatechange, ale to co miało pójść do serwera, poszło. Innym rozwiązaniem jest użycie synchronicznych requestów, przy czym trzeba mieć na uwadze, że mogą one blokować możliwość interakcji użytkownika ze stroną w czasie działania. Ale masz pewność, że pójdzie jeden za drugim, w takiej kolejności jak wynika z kodu. |
|
|
|
SeaDog jak dokładnie działa abort() w jQuery? 26.09.2014, 19:44:42
trueblue W jakim momencie uruchamiasz 2 pierwsze zabezpiecz... 27.09.2014, 18:23:16
SeaDog Pierwsze zabezpieczenie (zdjęcie zdarzenia z przyc... 28.09.2014, 17:57:40
trueblue Ok, to wróćmy może do abort.
Gdzie wywołujesz? 28.09.2014, 18:17:32
SeaDog [HTML] pobierz, plaintext <script>$(doc... 28.09.2014, 18:34:48
trueblue Spróbuj tak:
[HTML] pobierz, plaintext $(do... 28.09.2014, 18:46:53
SeaDog Zmienna timer jest chyba nie potrzebna, ponieważ s... 28.09.2014, 18:57:33
trueblue Tak. Powinno być:
timer=setTimeout(function(){send... 28.09.2014, 19:13:15
SeaDog Oczywiście, masz rację z clearTimeout(); tylko ja ... 28.09.2014, 19:53:07
trueblue Które rozwiązanie eliminuje duplikaty? 28.09.2014, 21:13:10
SeaDog Twojego rozwiązania nie testowałem. Myślałem, że o... 28.09.2014, 21:51:04
SeaDog Dziękuję bardzo za pomoc. Zapoznam się jeszcze z s... 30.09.2014, 09:51:19 ![]() ![]() |
|
Aktualny czas: 27.12.2025 - 15:12 |