![]() |
![]() ![]() |
![]() |
![]() ![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 1 707 Pomógł: 266 Dołączył: 3.07.2012 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Witajcie,
orientujecie się jakie są najlepsze techniki przy anulowaniu requestów Ajaxowych? Już tłumaczę o co chodzi: Załóżmy, że piszemy skrypt autocomplete dla inputa. Ktoś wpisuje kolejno litery:
Z oczywistych przyczym każde zdarzenie nie może generować osobnego requestu asynchronicznie, bo mielibyśmy śmietnik. W takim razie jakie są zalecane techniki w takich sytuacjach? Bawiłem się w coś takiego:
Działa prawidłowo, ale nie tak szybko jak powinno. Wygląda to tak, jakby metoda .abort() nie działała natychmiastowo. Da się to odczuć w tym przypadku, gdy szybko piszemy w tym polu. Odpowiedź przychodzi o wiele później niż w przypadku powolnego pisania. Pomysły? |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 728 Pomógł: 76 Dołączył: 12.06.2009 Ostrzeżenie: (0%) ![]() ![]() |
Bo wysłanie, przetworzenie odpowiedzi przez serwer i jej obsługa po stronie klienta trochę trwa. Nie jest to długo ale przy szybkim wpisywaniu tekstu może być odczuwalne.
Nie rozumiem natomiast czemu: Cytat Z oczywistych przyczym każde zdarzenie nie może generować osobnego requestu asynchronicznie Przecież właśnie wykonywanie żądania asynchronicznie znaczy tyle, że skrypt nie musi czekać na odpowiedź serwera i jest ogólnie zalecane. Jak wspomniałem w twoim przypadku to najprawdopodobniej kwestia przetworzenia i obsłużenia w krótkim czasie x requestów. Robisz coś na wzór Google Suggest, więc chodzi Ci o ograniczenie liczby request-ów wysyłanych do serwera. Sugeruję zrobić tak, że jeśli użytkownik wpisuje znaki szybciej niż ustalony limit czasowy (250-300ms) skrypt resetuje wskaźnik czasu i jednocześnie ustala go na nowo dla setTimeout, który obsługuje żądanie do serwera. Schemat wygląda tak : - tworzysz zmienną przechowująca wskaźnik czasu - resetujesz wskaźnik funkcją clearTimeout kiedy ma być wykonane żądanie do serwera - wykonujesz żądanie za pomocą seTimeout z ustalonym opóźnieniem czasowym i przypisujesz jego wynik do zmiennej przechowującej wskaźnik czasu. Dzięki temu jeśli user będzie szybszy niż czas to wskaźnik będzie resetowany patrz pkt.2 i żądanie nie będzie wykonane. -------------------- gry flash online
Dobry hosting i tanie odnowienia domen firma: masternet. Zarabianie bez wysiłku na domenach bez ruchu: prolink. |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 2 958 Pomógł: 574 Dołączył: 23.09.2008 Skąd: wiesz, że tu jestem? Ostrzeżenie: (0%) ![]() ![]() |
1. Liczenie ilości wpisanych znaków - request odpalany np. po wpisaniu min. 3 znaków
2. Timeout pomiędzy requestami ustawiony na 200-500 milisekund 3. Po stronie serwera to samo co w pkt.1 i 2 Jeżeli tak bardzo zależy ci na zabijaniu requestów - http://stackoverflow.com/questions/3312960...sending-another @edit byłeś szybszy ;P Ten post edytował CuteOne 15.06.2013, 21:18:57 |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 1 707 Pomógł: 266 Dołączył: 3.07.2012 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Bo wysłanie, przetworzenie odpowiedzi przez serwer i jej obsługa po stronie klienta trochę trwa. Nie jest to długo ale przy szybkim wpisywaniu tekstu może być odczuwalne. To raczej nie jest przyczyna, bo przecież abort możesz robić w każdym stanie requesta. Może on nawet nie zdążyć otrzymać odpowiedzi od serwera, więc to nie ma związku z moim pytaniem. Z tymi niezależnymi asynchronicznymi requestami chodziło mi o to, że wcale nie jest pewne który otrzyma odpowiedź szybciej. Nie jest wykluczony taki scenariusz:
I oto co się może stać:
I mamy wielką lipę. Oczywiście można użyć sztuczek, jak np. odsyłać w requeście wartość inputa z powrotem i używać odpowiedzi tylko wtedy, gdy pasuje do aktualnej wartości pola. Czyli rozumiem, że jasnego i oczywistego sposobu nie ma. |
|
|
![]()
Post
#5
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
A nie prościej, szybciej i lepiej jest użyć gotowych klas do tego? np. ta
http://bassistance.de/jquery-plugins/jquer...n-autocomplete/ -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 1 707 Pomógł: 266 Dołączył: 3.07.2012 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Oczywiście, że prościej. Autocomplete to tylko przykład, zastanowił mnie brak źródeł odpowiadających na tak banalne wydawałoby się pytanie.
|
|
|
![]()
Post
#7
|
|
![]() Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
Z tego, co wiem, to połączenie w trakcie oczekiwania na dane siedzi już w stosie TCP systemu operacyjnego, a przerwanie tego jest raczej średnio możliwe.
Lepiej olać wynik takiego. [; -------------------- ![]() ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW! |
|
|
![]()
Post
#8
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Cytat Z tego, co wiem, to połączenie w trakcie oczekiwania na dane siedzi już w stosie TCP systemu operacyjnego, a przerwanie tego jest raczej średnio możliwe. Ja tam pracuje na jQuery i przerywanie żądań ajaxowych odbywa się natychmiastowoAnalogowy smoku: ty żądania ajaxowe wysyłaj na serwer z lekkim opóźnieniem, a nie od razu gdy ktoś wpisze cokolwiek. Odczekaj te pół sekundy i dopiero gdy w tym czasie nie napisze kolejnej literki, dopiero wtedy slij żądanie. -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]() ![]() |
![]() |
Aktualny czas: 19.08.2025 - 13:14 |