![]() |
![]() |
![]() ![]()
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. |
|
|
![]()
Post
#3
|
|
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. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 4.10.2025 - 05:50 |