[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
function odswiezaj() { getData('includes/pobierz.php','mojDIVIK'); setTimeout("odswiezaj();", 1000); } function wstaw() { var tresc = document.getElementById("form").tresc.value; //var nick = document.getElementById("form").nick.value; var html = 'includes/dodaj.php'+'?tresc='+tresc; document.getElementById("form").tresc.value = ''; //document.getElementById("form").nick.value = nick; getData(html,'mojDIVIK'); }
function getData(dataSource, divID) { // kontynuuje wylacznie gdy obiekt nie jest zajety if (object.readyState==4 || object.readyState==0) { // tworzy zmienna odpowiadajaca konkretnemu obiektowi na stronie var obj = document.getElementById(divID); // czyta z pliku lub wykonuje skrypt object.open("GET", dataSource); // definiuje metode obslugi odpowiedzi serwera object.onreadystatechange = function() { // kontynuuje jesli transmisja zostala zakonczona powodzeniem if (object.readyState == 4 && object.status == 200){ obj.innerHTML= object.responseText;} else getData(dataSource, divID); } // wysyla zadanie do serwera object.send(null); } else getData(dataSource, divID); }
Nie uważasz, że za dużo odwołań rekurencyjnych?
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.
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ę.
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
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.
@viking - jakieś porady do tego, żeby to działało sprawnie? Jakiś inny sposób oprócz XHR?
Ja nie wiem co chcesz osiągnąć, ale może taki przykład Ci w jakiś sposób pomoże: https://jsfiddle.net/w3yhnzmw/
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.
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.
Standardowo przez polyfille https://github.com/Yaffle/EventSource
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)