Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [AJAX] Anulowanie requestów
Forum PHP.pl > Forum > Przedszkole
SmokAnalog
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?
amii
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.
CuteOne
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
SmokAnalog
Cytat(amii @ 15.06.2013, 22:15:28 ) *
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:

  1. Ktoś wpisuje K...
  2. Wpisuje KO...
  3. Wpisuje KOT...

I oto co się może stać:
  1. Przychodzi odpowiedź z K
  2. Przychodzi odpowiedź z KOT...
  3. Przychodzi odpowiedź z KO...


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.
nospor
A nie prościej, szybciej i lepiej jest użyć gotowych klas do tego? np. ta
http://bassistance.de/jquery-plugins/jquer...n-autocomplete/
SmokAnalog
Oczywiście, że prościej. Autocomplete to tylko przykład, zastanowił mnie brak źródeł odpowiadających na tak banalne wydawałoby się pytanie.
erix
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. [;
nospor
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ę natychmiastowo

Analogowy 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.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.