Newsgroup: it.comp.lang.javascript
Titolo: funzionamento di ajax (niubbone)

Salve a tutti, e scusate l'ottusità della domanda :)
Allora, io ho il seguente dubbio: all'interno di uno script ho bisogno 
di recuperare un dato da una pagina esterna, e per fare questo utilizzo 
l'oggetto XMLHttpRequest e imposto la funzione di callback per l'evento 
onReadyStateChange. Ma come posso fare per far sì che la funzione di 
callback mi restituisca un valore?
In soldoni, a me piacerebbe incapsulare tutto il processo della chiamata 
  in un modulo a parte, e ottenere nello script solo l'informazione che 
mi serve (anche soltanto l'html di un'altra pagina, ad esempio). Sono 
molto confuso, vero? E' che c'è qualcosa che non mi torna, ma non so cosa...
Marco

Mike Yanagita ha scritto:

Effettivamente di quello che ho scritto non si capiva molto, quindi 
provo a spiegarmi con un esempio :)
Due sono le cose di questo esempio, o mi incarto col ragionamento da 
qualche parte, o non ho capito nulla. Sia chiaro che a me di Ajax in sè 
non me ne frega niente, quindi se quello che voglio fare si può fare in 
altra maniera (ma non credo) non ho preclusioni ad ascoltare!!
Esempio: io vorrei popolare una tabella di una pagina con delle 
informazioni che recupero dall'html di una (o più) altra pagina.
Il mio ideale sarebbe incapsulare tutto il processo di recupero di un 
singolo dato all'interno di una serie di funzioni a cui io passo in 
input l'url della pagina e ottengo in risposta l'info che mi serve (ad 
esempio il contenuto di un certo tag, ma questo è ininfluente).
Quindi io vorrei questa funzione pippo(), in modo che facendo
miaInfo=pippo(url);
assegni alla variabile miaInfo l'informazione presa dall'altra pagina.
Come deve essere fatta pippo()?
pippo creerà una XmlHttpRequest con l'url specificato. La funzione di 
callback tramite la proprietà responseText recupererà l'html ed estrarrà 
da questo l'info che mi serve.
Ma a questo punto... come diavolo do il return dell'info per valorizzare 
la mia variabile miaInfo???
Qualcuno ha capito dove mi perdo? :)
Marco

 la mia variabile miaInfo???
non ho capito ... una volta che hai recuperato ciò che ti serve, return
"ciòchetiserve" e la var miaInfo conterrà ciò che ti serve ...
-- 
"Voi abili a tenere sempre un piede qua e uno là
 avrete un avvenire certo in questo mondo qua
 però la dignità
 dove l'avete persa?"
									    V.R.

 
Non mi sembra che vada così. Perchè quello che mi serve è recuperato da 
una funzione che viene attivata dall'evento onReadyStateChange 
dell'XMLHttpRequest: questo mi fa "saltare" il flusso della 
programmazione, è qua che mi incarto...
Marco

 programmazione, è qua che mi incarto...
ah ok; le prime che mi vengono in mente:
a) usa la modalità sincrona
b) usa una var globale e assegnagli il risultato direttamente nella
onReadyStateChange
-- 
"E' l' ignoranza che crea l'intolleranza
 di gente cieca e senza coscienza"
									  S.S.S.

 
Ecco, potrei provare in modalità sincrona, perchè l'ipotesi b non mi 
sembra praticabile...
Marco

 questo sarà un limite mio).
normalmente ci sono dei file di config che permettono di indicare eventuali
files o cartelle "pubbliche" nel sito (ossia che non richiedono
l'autenticazione)
-- 
"e mai che mi sia venuto in mente
 di essere più ubriaco di voi
 di essere molto più ubriaco di voi"
									  F.D.A.

 
No, non hai capito :)
Io sto realizzando uno script per Firefox + GreaseMonkey, con i quali 
lavoro su pagine di terzi, non ho la possibilità di rendere pubbliche o 
meno cartelle :)
Marco
-- 
know whatahmean, nudge nudge, know whatahmean, say no more?

 miaInfo=pippo(url);
Questo non è possibile. O meglio, è possibile se usi XmlHttpRequest in
modalità sincrona, ma tu non lo vuoi fare (fidati).
La callback viene chiamata in modo asincrono rispetto alla linea di
esecuzione in cui viene attivata la richiesta. La funzione di callback non
può restituire nulla al tuo codice, perché non è il tuo codice che la
chiama. Dovresti, quindi, cambiare leggermente il modo in cui stai
ragionando.
Ora ragioni così:
  myfunc:
      mi serve X
      XHR, vammi a prendere X !
      uso X
      ritorno
Devi invece ragionare così:
  myfunc: 
       mi serve X
       XHR, metti in coda la richiesta per X
        e chiama callback quando X è pronto
       ritorno
  callback:
       uso X
       ritorno
Se lo scope di myfunc contiene elementi indispensabili per "uso X", potrai
trovare comodo usare una closure (RTFM) come callback.
Max



No so che libreria javascript usi per invocare la chiamata asincrona (io ho usato prototype) ma la risposta è una sequenza di caratteri (la stessa che otterresti chiamando la URL con il browser a mano) che poi il tuo javascript di call back (quello che gestisce la risposta asincrona) deve interpretare ed elaborare.



Non so se sono stato chiaro.

Ciao

Olindo




 Olindo
Chiaro sei stato chiaro, ero io a non esserlo stato :)
Come puoi vedere dal dipanarsi della connversazione, il mio problema era 
capire il flusso dello script, ora ho le idee (un po') più chiare.
Grazie anche a te!
Marco

 
Scusa, la risposta che hai ricevuto era sempre mia, ma da un altro 
computer :)
Marco

 
Mi sono letto il FM, e devo dire che mi hai fatto scoprire un mondo nuovo :)
Per qualcun altro che fosse interessato, mi è sembrato carino questo 
articolo:
http://tinyurl.com/yqqthx
Grazie mille, adesso dovrò capire come ripensare il tutto :)
Marco

 trovare comodo usare una closure (RTFM) come callback.
Guarda, se di JS l'OP ne sa il giusto, io prima di suggerirgli l'uso
delle closure c'andrei coi piedi di piombo: Sarebbe meglio che prima
approfondisse Javascript, il DOM, e poi andasse a infognarsi in quel
fantastico mondo che sono le closure, i memory leak, ed il cambio di
scope. :)
A maggior ragione se il suo "imprinting" risale ai linguaggi vecchia
scuola, dove lo scope era ben definito e aveva un suo flusso preciso
e immutabile.
-- 
~ "Io ho fatto questo, dice la mia memoria
Io non posso aver fatto questo, dice il mio orgoglio.
Alla fine, è la memoria ad arrendersi." (Nietzsche)

 
http://tinyurl.com/yqqthx
Ehy chi si legge, un mio ex collega.. Dieci anni buoni fa, direi.. :)
(Al tempo sviluppava in C/C++, vedo che si è dato al web.)
-- 
~ "When you have eliminated the impossible, whatever remains, however
improbable, must be the truth." (S.H.)