Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: etapowe (?) odczywytwanie statusu
Forum PHP.pl > Forum > XML, AJAX > AJAX
piotrooo89
hej,

mam pewien problem związany z odczytywaniem statusu w jakim znajduję się aktualnie request ajax'owy, chociaż może słowo problem to za dużo ponieważ rozwiązałem to, jednak chciałbym się poradzić Was, czy da się do tego jakoś inaczej podejść, więc kolejno:

-wywołanie ajax'owedo requestu
-odpalenie skryptu
-w skrypcie mam dużo różnych akcji, wygląda to mniej więcej tak:

  1. // tu są jakieś akcje 1
  2.  
  3. echo Wykonano akcje 1;
  4.  
  5. //tu są jakieś akcje 2
  6.  
  7. echo Wykonano akcje 2;
  8.  
  9. etc...


i teraz mam tak iż wczytuje po kolei moje wykonane akcje do pliku, w tle mam odpalony kolejny request ajax'owy który odczytuje mi te dane i wypisuje na ekran w postaci:

Kod
Wykonano akcje 1    V
Wykonano akcje 2    V
etc...


te moje kolejne statusy miałem to trzymane w sesji ale przy asynchronicznych zapytaniach działało to średnio, więc teraz moje pytanie, jak Wy byście to widzieli?
kamil4u
A gdybyś odpowiednio to rozbił? Już wyjaśniam smile.gif

Dzielisz pliki na:
  1. // tu są jakieś akcje 1
  2.  
  3. echo Wykonano akcje 1;

  1. [php]// tu są jakieś akcje 2
  2.  
  3. echo Wykonano akcje 2;

  1. ....

Teraz przez AJAX wysyłasz zapytanie do pierwszego pliku. W wyniku dostajesz informację czy wykonano akcję + informację, który plik następnie wykonać( w tym przypadku zapytanie do drugiego) i tak w kółko. Dzięki temu po kolei będziesz miał na którym jesteś etapie + odpowiednie informację czy prawidłowo wykonano akcje.
piotrooo89
no właśnie nie bardzo, ponieważ dane w różnych miejscach są od siebie zależne i wydzielenie tego będzie trochę trudne w obecnej sytuacji. i też złożoność aplikacji będzie mi rosła strasznie (będę chciał stworzyć 10 kolejnych akcji == 10 kolejnych plików), pomysł ciekawy ale niestety nie dla mnie w obecnej konfiguracji.
kamil4u
To może zrób to na podobnej zasadzie tylko w jednym pliku.
  1. if( wykonać 1){ // tu są jakieś akcje 1
  2.  
  3. echo Wykonano akcje 1;
  4. } else if( wykonać 2 ){
  5. //tu są jakieś akcje 2
  6.  
  7. echo Wykonano akcje 2;
  8. } else if(
  9. etc...

Przez AJAX, będziesz przekazywał którą akcję aktualnie wykonać.

Oczywiście najlepiej switch-a wstawić, ale odruchowo if wpisałem.

--edit--
Jak nadal to nie to, to opisz trochę dokładniej. Co to za operacje i ile czasu trwają i jakieś inne informacje, które mogą się przydać.
piotrooo89
może być np sytuacja taka:

mam pętle która iteruje do N, i teraz chce wyświetlać tak:

Kod
wygenerowano 1
wygenerowano 2
wygenerowano 3
.
.
.
wygenerowano N


a co do tego co powiedziałeś o tym if/switch, to przemyślałem i też nie będzie to w pełni spełniać moich założeń, dlaczego? bo ja ustawiam różnego rodzaju zmienne (flagi) od których zależne jest dalsze wykonanie skryptu, jeśli chciałbym to wszystko przekazywać i później obsługiwać to była by to sieczka niesamowita.

//EDIT
chyba mam już rozwiązanie. zrobiłem zwykły ajax'owy request, i teraz nasłuchuje readyState, i sprawdzam czy jest status 3, czyli czytam niejako live od ajax'a i w taki sposób mogę się dobierać do tego co zwraca ajax w konkretnym momencie, jedyna niedogodność to że ajax zwraca wszystko czyli,
na początku dostaje:
Status 1
kolejny status dostaje
Status 1
Status 2

więc teraz tylko obrabiać te dane i już chyba jestem w "domu".
kamil4u
Nigdy nie używałem z AJAX-a z 3 smile.gif
Jak Ci się uda to zrobić to wrzucić gdzieś jakieś demo czy coś, żeby można było popatrzeć jak Ci to wyszło i jak to działa - byłoby fajnie.

Jeszcze można by było pomyśleć nad: WebSocket - tylko moja wiedza w tym zakresie nie jest zbyt duża, więc może to się nie nadaje( nie mówiąc już o dostępności w przeglądarkach )

Powodzenia!
wszerad
Tu sprawa rozbija się chyba o serwer. Specjalnie zrobiłem test bo spodziewałem się, że w tej sytuacji jak zawsze node.js mnie nie zawiedzie i tak:
Kod serwera:
  1. var http = require('http');
  2.  
  3. var ile = 4,
  4. inter;
  5.  
  6. function next(res){
  7. ile--;
  8. if(!ile)
  9. res.end();
  10. else
  11. res.write('chunk: '+ile+'\n');
  12. }
  13.  
  14. var srv = http.createServer(function (req, res) {
  15. res.writeHead(200, {
  16. 'Content-Type': 'text/plain',
  17. 'Access-Control-Allow-Origin': '*'
  18. });
  19. res.write('chunk: start\n');
  20. inter = setInterval(next, 500,res);
  21. }).listen(1337, '127.0.0.1');


Kod na stronie:
  1. function check(){
  2. console.log(xml.responseText);
  3. }
  4.  
  5. var xml = new XMLHttpRequest();
  6. xml.onreadystatechange = function(){
  7. if ( xml.readyState == 4) {
  8. xml = null;
  9. window.clearInterval(int);
  10. }
  11. };
  12. xml.open('GET', 'http://127.0.0.1:1337', true);
  13. xml.send();
  14. var int = window.setInterval(check,200);


No i efekt:
  1. chunk: start
  2. chunk: start
  3. chunk: start
  4. chunk: 3
  5. chunk: start
  6. chunk: 3
  7. chunk: start
  8. chunk: 3
  9. chunk: start
  10. chunk: 3
  11. chunk: 2
  12. chunk: start
  13. chunk: 3
  14. chunk: 2
  15. chunk: start
  16. chunk: 3
  17. chunk: 2
  18. chunk: 1
  19. chunk: start
  20. chunk: 3
  21. chunk: 2
  22. chunk: 1
  23. chunk: start
  24. chunk: 3
  25. chunk: 2
  26. chunk: 1

Log się zrobił trochę za duży bo nie synchronizowałem serwera z ajaxem.


Jedyne co potrzeba to node.js, lub opcja w php, http w wersji 1.1 i to chyba wszystko!
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.