MozillaPL.org - polskie centrum Mozilli

Główne menu:

[XMLHTTPRequest] Symulacja WaitForResponse

Projektowanie aplikacji i rozszerzeń opartych na technologiach Mozilla Foundation: XUL, JavaScript, XPCOM, XBL i innych

Moderator: Pomocy?!

[XMLHTTPRequest] Symulacja WaitForResponse

Postautor: rzseattle » 18 listopada 2005, 12:46

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.2; pl; rv:1.8) Gecko/20051107 Firefox/1.5

Od jakiegoś czasu bawie się asynchroniczymi wywołaniami. Muszę przyznac że gdy moja biblioteka obsługująca wywołania rozrosła się korzystanie ztakiej fomy pobierania danych stało się całkiem wygodne. Jednak jeden szczegół nie pozwala mi w pełni się cieszyć z tej metody.
Mianowicie choci o to że każde pobieranie danych muci być obsłuzone przez funkcje callbackową. Powoduje to znaczne pogorszenie komfortu programowania ponieważ nie możemy pobrać danych bezpośrednio do zmiennej i jednocześnie przerzucamy część logiki która owinna się znaleźć tuż przy wywołaniu do innej funkcji.

Przykład:
Kod: Zaznacz cały
<div id="container"></div>

<script type="text/javascript">

//zamiast calkiem naturalnego
document.getElementById( "container" ).value = ajax.makeRequest( "request" );

//jesteśmy zmuszeni do bardzo nie naturalnego

function callback( response ){
    document.getElementById( "container" ).value = response;
}

ajax.makeRequest( "request", callback );
</script>


Wiem że powyższy przykład wygląda całkiem niegroźnie ale przy bardziej skomplikowanych operacjach robi się już bałagan.


W pierwszym momencie rozwiązanie wydalo mi się banalnie proste. Aby zwrócić odpowiedź serwera wystaczy poczekać aż zostanie ona cała załadowana i przekazać ją dalej.

Coś w stylu:
Kod: Zaznacz cały
do{
   //jakas petla "usypiajaca"
}while(ajax.http.readyState != 4);



Okazuje sie jednak że przy takiej operacji readyState zawsze pozostaje jedynką , a nieskończona pętla wiesza przegladarki.

Przeszukałem naprawde spory kawałek sieci i nie udalo mi się znaleźć rozwiązania (oczywiście nie jest nim microsoftowski serverXMLHTTPReqquest ). Może ktoś wie jak zroić sleepa nie wieszającego firefoxa ?
rzseattle
 
Posty: 2
Z nami od: 18 listopada 2005, 12:40

Postautor: gand » 29 listopada 2005, 16:03

Przeglądarka: Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8) Gecko/20051107 Firefox/1.5

W taki sposob jak opisales (value = ajaxRequest()) to tego nie zrobisz ze wzgledu na zdarzeniowa nature tego obiektu. Natomiast mozesz uzyc setInterval do okresowego sprawdzania czy wartosc jest juz rowna 4. Tylko to nie rozwiaze skladni.. :/
gand
 

Re: [XMLHTTPRequest] Symulacja WaitForResponse

Postautor: Gość » 19 czerwca 2006, 13:46

Przeglądarka: Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4

rzseattle pisze:Przykład:
Kod: Zaznacz cały
//zamiast calkiem naturalnego
document.getElementById( "container" ).value = ajax.makeRequest( "request" );



możemy użyć nie mniej naturalnego:

Kod: Zaznacz cały
ajax.makeRequest("request", function(response ){
    document.getElementById( "container" ).value = response;
});


To tyle na temat składni..
Oczywiście kwestia co jest naturalne a co nie, jest tak naprawdę kwestią gustu ;)
Gość
 

Postautor: rzseattle » 19 czerwca 2006, 17:34

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4

To byl przyklad, kiedy chcialbys poprostu w funkcji przyporzadkowac wywolanie do zmiennej ktora uzywasz w nastepnej linijce to juz to nie jest takie oczywiste
rzseattle
 
Posty: 2
Z nami od: 18 listopada 2005, 12:40

Postautor: Gość » 20 czerwca 2006, 14:28

Przeglądarka: Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4

rzseattle pisze:To byl przyklad, kiedy chcialbys poprostu w funkcji przyporzadkowac wywolanie do zmiennej ktora uzywasz w nastepnej linijce to juz to nie jest takie oczywiste


Cóż to kwestia ogranizacji kodu :)
asynchroniczne api wymaga nieco innego sposobu myślenia..

Kod: Zaznacz cały
ajax.makeRequest("request", function(response ){
    document.getElementById( "container" ).value = response;

    alert("teraz robimy coś bardzo ważnego");

});


nie mam tylko pojęcia czy w JavaScript jest coś na kształt semaforów..
Gość
 


Wróć do Programowanie z użyciem technologii Mozilli

Kto jest online

Zarejestrowani użytkownicy: Bing [Bot], Google [Bot]

Przejdź do powiązanej strony

Nawigacja:

Stopka: