Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [javascript/ajax] Przypisanie wyniku do zmiennej np jako JSON, czy tylko synchronicznie
juzwa
post
Post #1





Grupa: Zarejestrowani
Postów: 144
Pomógł: 0
Dołączył: 10.07.2006

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


Jeśli poprzez ajaxa nie chcę zmieniać elementów strony, a jedynie zmieniać zawartość jakiejś zmiennej w obiekcie np przechowującej wartości w formacie JSON to czy tylko mogę robić to synchronicznie?

próbowałem robić coś samodzielnie, potem skorzystałem z jQuery i zawsze miałem ten sam problem, że próba przypisania była wcześniej niż koniec wywołania żądania, nawet wtedy gdy akcję umieszałem w onsuccesc czy oncomplete

wobec czegoś takiego zmieniłem tym żądania na synchroniczny i problemy się skończyły, ale czy da się zrobić tak, żeby
1)przypisanie było po zakończeniu żadania
2)przy okazji nie blokowało przeglądarki do czasu zakończenia żądania
Go to the top of the page
+Quote Post
wookieb
post
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Wiec musisz to zrobic w sposob asynchroniczny i w metodzie która jest wywoływana na koniec zadania musisz przypisac wartosci twoim zmiennym.

Nie można wysyłać żadania w sposób synchroniczny i nie blokować przeglądarki.


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





Grupa: Zarejestrowani
Postów: 144
Pomógł: 0
Dołączył: 10.07.2006

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


dzięki za odpowiedź
wiem muszę ale jak

aby nie pisać zbyt dużo

1)jQuery ma $.ajax, w którym jest complete (czyli gdy żądanie jest zakończone)
2)w complete umieszczam jakąś funkcję w postaci function(){obiekt.pozakonczeniu())
wygląda to tak

  1. complete:function(XMLHttpRequest, textStatus)
  2. {
  3. if(typeof set.completefun == 'function')
  4. {
  5. gAjaxRes=(textStatus=='success')?eval(XMLHttpRequest.responseText):null;//zazwyczaj są to jakieś JSON-y stąd eval
  6. set.completefun();
  7. }
  8.  
  9. }
  10. gAjaxRes -> globalna zmienna do przechwytywania wartości zwróconej przez ajax


3)wywołuję funkcję którą wysłałem - zazwyczaj jest to funkcja która wywołuję metodę dla jakiegoś obiektu function(){obiekt.metoda();}
4)przy wywołaniu asynchronicznym wywoływana funkcja nie jest po zakończeniu żądania - czemu?

funkcja wywoływana w complete wygląda tak (właściwie jej prototyp)
  1. obiekt.prototype.pozakonczeniu=function()
  2. {
  3. if(gAjaxRes.length) {/*rób co trzeba*/}
  4. else alert('pusto');
  5. }


jak łatwo się domyśleć przy synchronicznym nie ma alertu (zrobione jest tak że zawsze jest jakiś rezultat) przy asynchronicznym alert jest zawsze


czy ma może ktoś pomysł czemu tak jest i jak sobie z tym poradzić żeby było asynchronicznie i dobrze, czyli żeby się ten alert nie pojawiał
Go to the top of the page
+Quote Post
wookieb
post
Post #4





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Trochę odkrywasz na nowo koło ponieważ można bardzo prosto
Kod
$.ajax({
  type: "POST",
  url: "test.php",
  dataType: "json",
success:function(twojeDaneJson)
{
// tutaj robisz sobie z "twojeDaneJson" (ktorych nie musisz juz parsowac evalem) co chcesz
}
});


Ten post edytował wookieb 17.04.2009, 13:37:21


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





Grupa: Zarejestrowani
Postów: 144
Pomógł: 0
Dołączył: 10.07.2006

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


dzięki raz jeszcze, ale trochę nie rozumiem, albo coś źle widzę

zostańmy przy jQuery

1)zrobiłem sobie funkcję
  1. ajax(s)
  2. {
  3. var set{
  4. url:s.url,
  5. data:s.data,
  6. asynchro:s.asyn,
  7. cfun:s.cplFun/*itd*/
  8. };
  9. /*potem jest ajax z jQuery*/
  10. $.ajax
  11. {
  12. /*między innymi*/
  13. success: function(res){},
  14. complete:function(XMLHttpRequest, textStatus){},
  15. }
  16.  
  17. };


zrobione jest to tak, aby np w jednym mieć wszystko, np obsługę wygaśnięcia sesji, obiekt HTML (diva) do którego wrzuć trzeba treść zmienioną itp itd

2)wywołuje to tak
  1. ajax({url:'/url/'.data:'id=1&o=11'});



wracając do podstawienia wyniku do zmiennej
to gdy chcę np uzyskanego JSON-a przekazać do zmiennej to przy asynchronicznym jest błąd związany z tym, że nie funkcja wykonuje się wcześniej niz trzeba

Funkcja COMPLETE wygląda tak
  1. completefunction(XMLHttpRequest, textStatus)
  2. {
  3. if(typeof set.cfun == 'function')
  4. {
  5. gObiekty=(textStatus=='success')?eval(XMLHttpRequest.responseText):null;
  6. set.cfun();
  7. }
  8. }


i na mój rozum powinna się wywołać już PO zakończeniu żądania - niestety tak nie jest

przykładowa funkcja wywoływana w complete
  1. function cbPrzypiszObj(obj)
  2. {
  3. obj.uaktualnij();
  4. }
  5.  
  6. czyli jest ona przekazywana w taki sposób w obiekcie (dokladniej w prototypie funkcji obiektu)
  7. ajax({
  8. ...,s.cfun=function(){cbPrzypiszObj(this);}
  9. });


sam prototyp wygląda tak

  1. probki.prototype.uaktualnij=function()
  2. {
  3. this.nObj=gObiekty;
  4. if(this.nObj.length)
  5. {}
  6. else
  7. {}
  8.  
  9. }


no i w powyższym gdy jest połączenie synchroniczne wszystko jest OK, gdy jest asynchroniczne wskakuje mi do else - a jest tak (na razie) zrobione, że zawsze coś zwraca i nie ma prawa wejść do else

próbowałem różnych rzeczy, ale nic nie zadziało - w dalszym ciągu gdy jest asynchroniczonść to nie działa gdy jest synchronicznosć to działa - próbowałem to robić na succes, complete, kombinowałem z funkcjami, wyprowadzałem je na zwewnatrz (jako globalne a nie metody klasy) próbowałem funkcję ajax wywoływać na zewnątrz itp itd
nic nie pomogło do tej pory

może ktoś będzie miał jakiś pomysł?

Ten post edytował juzwa 20.04.2009, 10:24:20
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 - 06:07