Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [javascript/ajax] Przypisanie wyniku do zmiennej np jako JSON
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
juzwa
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
wookieb
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.
juzwa
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ł
wookieb
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
}
});
juzwa
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ł?
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.