Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [jQuery] Funkcja .ajax() - problem z zapętleniem
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
zgred1010
Witam. Chciałbym zrobić sobie funkcje która będzie mi się powtarzała co jakiś czas ( w tym wypadku co sekundę )

To mój wstępny kod:
  1. <script type='text/javascript'>
  2. var check_mess = function(){
  3. $.ajax({
  4. url: "messages.php",
  5. success: function(data){
  6. $( "#ile_pw_show" ).empty().append(data);
  7. }
  8. });
  9. setTimeout(check_mess(), 1000);
  10. }
  11. $(document).ready(function(){
  12. setTimeout(check_mess(), 1000);
  13. });
  14. </script>


Kod w pewnym stopniu działa, ale "zamula" stronę w przeglądarce google chrome....

Bardzo bym prosiło o zoptymalizowanie kodu! businesssmiley.png
kamil4u
Od tego jest setInterval - https://developer.mozilla.org/En/window.setInterval

Jak nadal będzie zamulać to napisz coś więcej, dużo więcej smile.gif - bo wtedy to nie wina samej funkcji, a Twojego kodu smile.gif

--edit--
Nie znam dobrze jQuery, stąd potrzebuje dokładniejszego opisu z Twojej strony to może coś wymyślimy smile.gif
Sprawdź jak to się ma pod innymi przeglądarkami
morbic
Kolega wyżej ma rację - setInterval(). W dodatku dałbym maksimum 5-10 sekund, nawet więcej, ale nie jedną. Nic dziwnego, że zamula, jak w kółko mieli requesty.
kamil4u
Cytat
W dodatku dałbym maksimum 5-10 sekund, nawet więcej, ale nie jedną.
Chyba minimum smile.gif
Cytat
Nic dziwnego, że zamula, jak w kółko mieli requesty.

Moim zdaniem to nic takiego smile.gif - no chyba, że w grę wchodzi znaczna ilość użytkowników "obsługująca" stronę w tym samym czasie.
morbic
Tak, minimum, przejęzyczyłem się.

Przy niektórych serwerach ma to znaczenie dla przeglądarki. Jeśli serwer odpowiada dłużej niż jedną sekundę, to requesty nakładają się, przeglądarka zajmuje się kilkoma naraz, wszystko się piętrzy, a przeglądarka może mulić. Należy pamiętać, że $.ajax() jest asynchroniczne.

Może jednak lepiej zostawić to z setTimeout(), ale dać je dopiero, kiedy poprzednie żądanie się zakończy:

  1. <script type='text/javascript'>
  2. var check_mess = function(){
  3. $.ajax({
  4. url: "messages.php",
  5. success: function(data){
  6. $( "#ile_pw_show" ).empty().append(data);
  7. setTimeout(check_mess(), 1000);
  8. }
  9. });
  10. }
  11.  
  12. $(document).ready(function(){
  13. setTimeout(check_mess(), 1000);
  14. });
kamil4u
Wątpię, żeby tak było - moim zdaniem "pomuli" i wszystko wróci do normy. Niestety nie mam dowodu na poparcie tych słów, a żadnych testów nie chce mi się robić(możliwe, że się mylę). AJAX nie musi być asynchroniczny (np. w jquery(jeżeli już z tego korzystamy) parametr async).

Kod, który podałeś też jest ok, ale jak mówiłem, moim zdaniem to nie wina samej funkcjonalności opóźnień, a kodu założyciela tematu. Poczekajmy, aż ~zgred1010 skorzysta z naszych rad i zobaczymy jak to wszystko będzie funkcjonowało smile.gif

Pozdrawiam
morbic
Możesz mieć rację, ale i tak staram się unikać takiego bombardowania serwera. Zwłaszcza przy dużej liczbie userów.

A co do asynchronicznego jQuery: http://api.jquery.com/jQuery.ajax/
Cytat
Description: Perform an asynchronous HTTP (Ajax) request.

Cytat
async
Default: true
kamil4u
Ja też nie smile.gif - chyba, ze zachodzi taka potrzeba - tu pewnie nie smile.gif
Z tym async to miało być po prostu pokazanie/przypomnienie Ci, że jest taka możliwość smile.gif
zgred1010
  1. <script type='text/javascript'>
  2. var check_mess = function(){
  3. $.ajax({
  4. url: "<?php echo $site['url']; ?>pliki/panel_usera/messages.php",
  5. success: function(data){
  6. $( "#ile_pw_show" ).empty().append(data);
  7. setInterval(check_mess(), 3000);
  8. }
  9. });
  10. }
  11. $(document).ready(function(){
  12. setInterval(check_mess(), 3000);
  13. });
  14. </script>


Jest połowa sukcesu oneeyedsmiley02.png
z małym ALE...

Strona się wczytała (pod względem treści i grafiki) ale cały czas pokazuje stan wczytywania (jeśli chodzi o Google chrome / na innych nie sprawdzałem jeszcze)
Czytałem wszystkich posty...
1 sekunda to w fazie testu... tylko ja mam dostęp póki co do strony...

Z tego co mi wiadomo to strona będzie miała minimalnie 10 000 odwiedzin dziennie....
Więc sądze że ustawie to na 2-3 minuty....
Jeśli sądzicie że są lepsze funkcje to śmiało mnie informujcie!
Ja się na jQuery dużo nie znam i się uczę...


Ps.: Jeśli kogoś interesuje to skrypt będzie sprawdzał na żywo czy użytkownik nie ma wiadomości nowych... więc w pliku messages.php jest zliczanie nieprzeczytanych wiadomości...
morbic
Ugh, to mamy tu poważne zapętlenie.

setInterval() wywołuje się raz, a funkcja ta powoduje cykliczne wykonywanie określonej instrukcji. Zlecasz raz i koniec.
setTimeout() wykonuje instrukcję jednokrotnie po określonym upływie czasu.

Jeśli na początku wywołujesz setInterval(), a później jeszcze przy każdym pobraniu danych, to może być niezły pasztet.

Masz dwa wyjścia:
  1. Ustawić setInterval() tylko raz, wewnątrz $(document).ready();
  2. zostawić skrypt tak jak teraz, ale z setTimeout();
zgred1010
ok sprawdzę smile.gif jak serwer mi odpowie to dam znać wink.gif

Panowie ;] panie biggrin.gif

Udało się biggrin.gif dzięki waszej pomocy biggrin.gif i niewielkiej pomocy samego siebie doszliśmy do końca biggrin.gif

  1. <script type='text/javascript'>
  2. var check_mess = function(){
  3. $.ajax({
  4. url: "<?php echo $site['url']; ?>pliki/panel_usera/messages.php",
  5. success: function(data){
  6. $( "#ile_pw_show" ).empty().append(data);
  7. }
  8. });
  9. }
  10. $(document).ready(function(){
  11. setInterval(check_mess, 3000);
  12. });
  13. </script>


Usunąłem po wykonaniu zadania funkcje setInterval()
i w
  1. $(document).ready(function(){
  2. setInterval(check_mess, 3000);
  3. });

zmieniłem check_mess() na check_mess

Wszystko działa smile.gif

Teraz śmigam robić facebooka ;]
dzięki wielkie smile.gif
Rid
Nie wiem czemu nikt,tego nie używa:
var $jq=jQuery.noConflict();
i zamiast
$(document).ready(function(){ użyć:
$jq(document).ready(function(){
Niech Pan włączy firebuga i zobaczy Pan błędy typu ala,że $ nie jest zdefiniowana"
kamil4u
@Rid - noConflict używa się w przypadku korzystania z 2 lub więcej bibliotek,w której to znajduje się funkcja "$" - w tym wypadku chyba to nie następuje, więc Twoja rada wydaje się zbyteczna.

Cytat
Niech Pan włączy firebuga i zobaczy Pan błędy typu ala,że $ nie jest zdefiniowana"

Gdy nigdzie indziej nie występuje inna funkcja "$", takie błędu nie będzie.

PS. Na forum mamy zwyczaj mówienia sobie na 'ty'.
Rid
Tak,wiem to ,ale jak projekt ,stronka się rozrośnie i zostanie np dodany jakikolwiek zewnętrzny plik js.Jakiś plugin jq,skrypt z elementami jq to trzeba będzie wtedy przerabiać,to nie lepiej od razu jest tego użyć ,niż potem bawić się w przerabianie.
zgred1010
z innych bibliotek nie korzystam wink.gif Projekt jest już przy końcu wink.gif a większość pluginów piszę osobiście
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.