Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ AJAX _ Problem z odświeżaniem strony.

Napisany przez: MalKavar 9.10.2016, 16:57:40

[Java][/Java]Więc, piszę skrypt, który co sekundę odpytuje bazę danych o odpowiednie dane. Wszystko za pomocą ajax. Poza tym, z formularza jest wykonywany plik php, który dodaje co jakiś czas rekordy do bazy. I tu zaczyna się problem. Po kilkunastu sekundach skrypt pada. Tak jakby setTimeout postanowił zaniemówić. Ktoś może spotkał się z czymś takim?
Funkcja odswiezaj i wstaw

[JAVASCRIPT] pobierz, plaintext
  1. function odswiezaj()
  2. {
  3. getData('includes/pobierz.php','mojDIVIK');
  4. setTimeout("odswiezaj();", 1000);
  5. }
  6.  
  7. function wstaw()
  8. {
  9. var tresc = document.getElementById("form").tresc.value;
  10. //var nick = document.getElementById("form").nick.value;
  11. var html = 'includes/dodaj.php'+'?tresc='+tresc;
  12. document.getElementById("form").tresc.value = '';
  13. //document.getElementById("form").nick.value = nick;
  14.  
  15. getData(html,'mojDIVIK');
  16. }
[JAVASCRIPT] pobierz, plaintext



Funkcja getData
[JAVASCRIPT] pobierz, plaintext
  1. function getData(dataSource, divID)
  2. {
  3. // kontynuuje wylacznie gdy obiekt nie jest zajety
  4. if (object.readyState==4 || object.readyState==0)
  5. {
  6. // tworzy zmienna odpowiadajaca konkretnemu obiektowi na stronie
  7. var obj = document.getElementById(divID);
  8.  
  9. // czyta z pliku lub wykonuje skrypt
  10. object.open("GET", dataSource);
  11.  
  12. // definiuje metode obslugi odpowiedzi serwera
  13. object.onreadystatechange = function()
  14. {
  15. // kontynuuje jesli transmisja zostala zakonczona powodzeniem
  16. if (object.readyState == 4 && object.status == 200){
  17. obj.innerHTML= object.responseText;}
  18. else getData(dataSource, divID);
  19. }
  20. // wysyla zadanie do serwera
  21. object.send(null);
  22. }
  23. else getData(dataSource, divID);
  24. }
[JAVASCRIPT] pobierz, plaintext

Napisany przez: trueblue 9.10.2016, 17:13:18

Nie uważasz, że za dużo odwołań rekurencyjnych?

Napisany przez: MalKavar 9.10.2016, 17:21:49

W funkcji getDate w sensie? Jak widać wyżej obie funkcje korzystają z getDate - o ile dla odbierania danych można przeżyć odpowiedź po np 5 sekundach(przyjmuję, że kilka razy się może nie wykonać z powodu braku dostępu do pliku), o tyle dla wysyłania nie mogę pozwolić na stratę żadnego wysłanego zapytania. Prznajmniej takie jest moje myślenie. Samo wysyłanie się poprawiło po wprowadzeniu tych rekurencji, wysyła się w 99% wypadków, jednak z odbieraniem gorzej - jak napisałem wyżej, po 10, max 20 sekundach skrypt zdaje się zaprzestawać akcji.

Napisany przez: trueblue 9.10.2016, 17:27:00

Nie wiem jak rozumiem stratę wysyłanego zapytania.

Ponowienie wysyłania powinno nastąpić w funkcji zdefiniowanej we właściwości onreadystatechange obiektu.
Tam sprawdzasz wynik, odświeżasz div na jego podstawie i wywołujesz ponownie funkcję.

Napisany przez: MalKavar 9.10.2016, 17:33:36

Możesz to wyjaśnić dokładniej bo nie do końca rozumiem. W moim założeniu

jeśli(readystate == 4 lub readystate == 0)
wykonuj zadanie
w przeciwnym wypadku
wykonaj się ponownie

Napisany przez: viking 9.10.2016, 17:39:29

A gdzie tu jakieś kolejkowanie zadań? IMO powinieneś użyć promise, po zakończeniu albo timeoucie wysłać jeszcze raz niezapisane dane. No i XHR kompletnie nie pasuje do takiego zadania.

Napisany przez: MalKavar 9.10.2016, 17:46:09

@viking - jakieś porady do tego, żeby to działało sprawnie? Jakiś inny sposób oprócz XHR?

Napisany przez: trueblue 9.10.2016, 17:51:00

Ja nie wiem co chcesz osiągnąć, ale może taki przykład Ci w jakiś sposób pomoże: https://jsfiddle.net/w3yhnzmw/

Napisany przez: viking 9.10.2016, 18:06:42

To nie JS powinien zajeżdżać serwer co sekundę tylko serwer powinien informować że nastąpiła zmiana. Zatem https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events
Zapis - zależy jak to działa.

Napisany przez: MalKavar 9.10.2016, 18:16:15

Hmm... Nie pomyślałem o takim rozwiązaniu.
@viking, z tego co widzę na pierwszy rzut oka - twoje rozwiązanie jest o wiele lepsze. Postaram się je szybko wprowadzić. W razie problemów mogę liczyć na twoją pomoc na PW? Javascript nie jest moją mocną stroną.
P.S Z tego co wyczytałem rozwiązanie nie jest wspierane przez IE i tylko częściowo przez Safari. Da radę zrobić, żeby i na tych przeglądarkach to zadziałało bez zarzutu? Zależy mi głównie na Safari.
@trueblue Twoje rozwiązanie póki co działa bez zarzutu, ale wciąż sprawdzam.

Napisany przez: viking 9.10.2016, 18:26:14

Standardowo przez polyfille https://github.com/Yaffle/EventSource

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)