Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [jQuery] Funkcja .ajax() - problem z zapętleniem
zgred1010
post
Post #1





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 21.07.2010

Ostrzeżenie: (0%)
-----


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

Ten post edytował zgred1010 2.07.2011, 22:55:57
Go to the top of the page
+Quote Post
kamil4u
post
Post #2





Grupa: Zarejestrowani
Postów: 2 350
Pomógł: 512
Dołączył: 4.01.2009
Skąd: Wrocław / Świdnica

Ostrzeżenie: (0%)
-----


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

Ten post edytował kamil4u 2.07.2011, 22:47:14


--------------------
Go to the top of the page
+Quote Post
morbic
post
Post #3





Grupa: Zarejestrowani
Postów: 116
Pomógł: 29
Dołączył: 13.12.2010
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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.


--------------------
"Aby zrozumieć rekurencję, musisz najpierw zrozumieć rekurencję."
Go to the top of the page
+Quote Post
kamil4u
post
Post #4





Grupa: Zarejestrowani
Postów: 2 350
Pomógł: 512
Dołączył: 4.01.2009
Skąd: Wrocław / Świdnica

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
morbic
post
Post #5





Grupa: Zarejestrowani
Postów: 116
Pomógł: 29
Dołączył: 13.12.2010
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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. });


--------------------
"Aby zrozumieć rekurencję, musisz najpierw zrozumieć rekurencję."
Go to the top of the page
+Quote Post
kamil4u
post
Post #6





Grupa: Zarejestrowani
Postów: 2 350
Pomógł: 512
Dołączył: 4.01.2009
Skąd: Wrocław / Świdnica

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
morbic
post
Post #7





Grupa: Zarejestrowani
Postów: 116
Pomógł: 29
Dołączył: 13.12.2010
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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


--------------------
"Aby zrozumieć rekurencję, musisz najpierw zrozumieć rekurencję."
Go to the top of the page
+Quote Post
kamil4u
post
Post #8





Grupa: Zarejestrowani
Postów: 2 350
Pomógł: 512
Dołączył: 4.01.2009
Skąd: Wrocław / Świdnica

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
zgred1010
post
Post #9





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 21.07.2010

Ostrzeżenie: (0%)
-----


  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...
Go to the top of the page
+Quote Post
morbic
post
Post #10





Grupa: Zarejestrowani
Postów: 116
Pomógł: 29
Dołączył: 13.12.2010
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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();


--------------------
"Aby zrozumieć rekurencję, musisz najpierw zrozumieć rekurencję."
Go to the top of the page
+Quote Post
zgred1010
post
Post #11





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 21.07.2010

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Rid
post
Post #12





Grupa: Zarejestrowani
Postów: 715
Pomógł: 47
Dołączył: 5.12.2010

Ostrzeżenie: (0%)
-----


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"
Go to the top of the page
+Quote Post
kamil4u
post
Post #13





Grupa: Zarejestrowani
Postów: 2 350
Pomógł: 512
Dołączył: 4.01.2009
Skąd: Wrocław / Świdnica

Ostrzeżenie: (0%)
-----


@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'.


--------------------
Go to the top of the page
+Quote Post
Rid
post
Post #14





Grupa: Zarejestrowani
Postów: 715
Pomógł: 47
Dołączył: 5.12.2010

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
zgred1010
post
Post #15





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 21.07.2010

Ostrzeżenie: (0%)
-----


z innych bibliotek nie korzystam wink.gif Projekt jest już przy końcu wink.gif a większość pluginów piszę osobiście
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 21.08.2025 - 10:27