Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [AJAX] Anulowanie requestów
SmokAnalog
post
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:
  1. K - wysyła się zapytanie o sugestie na K
  2. KO - znów wysyłami, tym razem na KO...
  3. KOT - KOT...


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:
[JAVASCRIPT] pobierz, plaintext
  1. var xhr = {};
  2.  
  3. $("#field").bind("input", function() {
  4. if(typeof xhr.abort === "function") {
  5. xhr.abort();
  6. }
  7. xhr = $.get(
  8. // parametry requesta
  9. );
  10. });
[JAVASCRIPT] pobierz, plaintext


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?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
amii
post
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.
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 3.10.2025 - 09:25