Newsgroup: it.comp.lang.javascript
Titolo: Test XmlHttpRequest

A seguito dei problemi con la chat che ho avuto (e di cui zer0 avrà i
maroni pieni :) ), ho fatto un piccolo test. I risultati sono curiosi... il
funzionamento è semplice: serve a vedere cosa succede se, subito dopo aver
inviato una richiesta xmlhttp (metodo "send"), la location della pagina che
ha inviato detta richiesta cambia. I browser con cui ho provato danno
ciascuno un risultato diverso. Firefox è l'unico che fornisce un risultato
che può creare dei problemi, in quanto mostra il valore di readyState pari
a 4 (che dovrebbe significare "operazione completata") senza che sia
accessibile la proprietà status.
Per chi fosse interessato, il test è qui:
http://www.nare.it/prove/xmlhttp2/results.asp
-- 
Nando [?]
Ex-Apostolo della Ex-Prova

 ho fatto un piccolo test
Suvvia, datemi un feedback!
Scegliere fra le seguenti risposte:
[ ] A cqua calda... scoperta secoli fa
[ ] B oh, macchissenefrega
[ ] C azzo, interessante!
[ ] D irei che... [indicare sotto il commento]
    _________________________________________


 [ ] D irei che... [indicare sotto il commento]
 [X] Z er0 ne "avrà i maroni pieni" e quindi è esentato
:P
Scherzi a parte, su Firefox che errore ti dà di preciso? E mi dici se in
questa pagina, sorella della tua:
beats.daily.it/iclj/test.htm
ti dà il medesimo errore facendo le medesime azioni?
-- 
- E.. lei è mestruata al momento?
- Ma scusi questo che c' entra??
- Si inchini alla scienza!

 ti dà il medesimo errore facendo le medesime azioni?
Mi pare che il comportamento sia identico.


 Mi pare che il comportamento sia identico.
Difatti è il "clone" esatto della tua pagina, con la differenza che invece che
ASP è PHP. Il fatto è che nella tua pagina mi dà un errore più spesso che in
questa, e cercavo di capire il discriminante, dato che è identica; tranne che
per gli header della risposta. Forse è il connection close.
-- 
- Lei ha precedenti di pazzia in famiglia?
- Mio nonno credeva d' essere San Giuseppe...
- Io ci metterei un bel SI!

 Mi pare che il comportamento sia identico.
Difatti è il "clone" esatto della tua pagina, con la differenza che invece che
ASP è PHP. Il fatto è che nella tua pagina mi dà un errore più spesso che in
questa, e cercavo di capire il discriminante, dato che è identica; tranne che
per gli header della risposta. Forse è il connection close.
BTW, adesso è tutto abbastanza chiaro.


 BTW, adesso è tutto abbastanza chiaro.
Ecco, era quello che speravo...
Già che ci sei, appena puoi, chieriresti anche a me la faccenda? :))


 Già che ci sei, appena puoi, chieriresti anche a me la faccenda? :))
Sai qual'è il problema dei thread troppo lunghi (ovvero, di seguire il codice
di un altro per troppo tempo, senza poterlo studiare per bene)? Che finisci
per acquisire il punto di vista di chi ha scritto il codice.
Cmq sia, prima approfondiamo un paio di cose, e poi ti spiego se ce ne sarà
ancora bisogno.
-- 
- Voi chi dovreste essere? Una specie di cosmonauti?
- No disinfestatori, hanno visto uno scarafaggio al 12°
- Deve essere grosso questo scarafaggio
- Enorme, stacca le teste a morsi!

 ancora bisogno.
Ben volentieri... quando e come puoi. Un passo alla volta... da dove si
parte? :)


 parte? :)
Dalle informazioni che hai ottenuto con il tuo debug, e quali sono le tue
conclusioni in merito. Ti dò tre suggerimenti:
a) Lascia da parte l'errore della js console per il momento, è rilevante ma
non per la tua problematica sul readyState. Se invece "sai già" la risposta,
scrivimela.
b) Confronta i risultati tra le due operazioni (restando sulla pagina /
lasciandola), se ancora non ti è chiaro aggiungi un ritardo alla risposta del
server.
c) "When you have eliminated the impossible, whatever remains, however
improbable, must be the truth."
-- 
- Venimmo, vedemmo... e lo inculammo!

 ma com'e` umano, lei... :-D
Si figuri Fantocci, si figuri...!
-- 
- Ray è completamente partito Egon, di te che ne è restato?
- Mi dispiace Venkman,il terrore travalica la mia capacità di razionalizzare

 improbable, must be the truth."
AIUUUUUUUUUUUUUTOOOOOOOOOOOOOOOOOOOOOOOOOOO!
Cmq, oltre a quanto ho già scritto, ho anche cambiato una cosetta: il
reload lo faccio partire con un po' di ritardo. Credo che il comportamento
diverso di firefox stia nel fatto che lui comunque vuole in qualche modo
avvisare che la richiesta http "ha terminato la corsa", mentre gli altri
non lo fanno. E' così? Se è così, come faccio a capire che "la corsa" è
finita male?
Inoltre, firefox (cosa peraltro già nota) permette di accedere a status
anche quando readystate è 2 o 3, non solo quando è 4; nell'ultima prova
(con il ritardo sul cambio pagina e inviando la risposta dal server un po'
alla volta e "lentamente") vedo che status è praticamente sempre
leggibile... Le idee quasi quasi mi si stanno complicando...
Forse basta verificare che readystate "abbia assunto" il valore 2?
Ti prego, aiutami... ho l'influenza, due giorni di febbre, lo stomaco non
te lo dico neanche... un ulteriore sforzo potrebbe essermi fatale :-P
-- 
Nando [?]
Apostolo della Prova

 te lo dico neanche... un ulteriore sforzo potrebbe essermi fatale :-P
Allora riprenderemo quando ti sarà passata. :)
-- 
"When you have eliminated the impossible, whatever remains,
however improbable, must be the truth."
on air ~ "Good Charlotte - We Believe"

 Allora riprenderemo quando ti sarą passata. :)
Fancuuuuuuuuulo! :)


 Fancuuuuuuuuulo! :)
La prossima volta sarņ ugualmente conciso. :P
-- 
- E.. lei č mestruata al momento?


 Allora riprenderemo quando ti sarà passata. :)
Riassumo quello che mi sembra di aver capito:
1) ogni browser fa un po' come gli pare
2) l'unico che sembra portare a termine il "ciclo" dei valory del
readystate (arriva fino a 4) è firefox, in ogni caso; da questo si potrebbe
pensare che firefox faccia una sorta di abort (???) della richiesta quando
l'oggetto relativo è in fase di distruzione (???? ho paura di ciò che sto
dicendo... please non linciatemi)
3) se l'unload della pagina si avvia prima che la proprietà status abbia
assunto un valore (e quindi sia utilizzabile), la stessa resta ovviamente
inutilizzabile anche se readystate arriva ad assumere (come fa in firefox)
il valore 4
4) c'è una differenza nella gestione anche della proprietà responsetext: in
firefox è disponibile già quando readystate==2 (eventualmente è una stringa
vuota), in netscape anche (ma all'inizio è un oggetto null), in explorer è
disponibile solo quando readystate vale 4 (!), opera la rende sempre
disponibile come stringa
Professo', io più di questo non riesco a capire... se mi date un aiutino,
forse...


 Professo', io più di questo non riesco a capire...
Mi pare che tu abbia capito quasi tutto, cosa c'è che ti rende ancora
perplesso?
-- 
- Vuoi tu questo corpo?
- E' una domanda trabocchetto?

 perplesso?
La sensazione, appunto, di aver capito "quasi" tutto. E poi, mi manca il
modo in cui utilizzare queste informazioni per evitare che l'eccezione
venga sollevata... la cosa più semplice che mi viene in mente è un
try-catch (col catch non vuoto, però :) ), una cosa del tipo:
if (oReq.readyState==4) {
  try {
    var ok=(oReq.status==200)
  }
  catch(e) {
    var ok=false;
  };
  if (ok) {
    // Richiesta completata correttamente - Utilizza il risultato
  };
};
o anche
try {
  var ok=(oReq.readyState==4 && oReq.status==200)
} catch(e) {
  var ok=false
};
if (ok) {
  // Richiesta completata correttamente - Utilizza il risultato
};
Questo perché non riesco a trovare un modo per capire se la proprietà
status è accessibile o meno.


 status è accessibile o meno.
Puoi anche usare il try/catch. Ma non capisco come ancora ti sfugga la logica
della cosa, ce l'hai davanti agli occhi e ne hai parlato più volte tu stesso
in questo thread.
Vediamo se con questo ti aiuto maggiormente: non guardare lo status come una
proprietà dell'oggetto, ma per quello che significa.


 proprietà dell'oggetto, ma per quello che significa.
"The status of the response to the request for HTTP requests", questo
leggo. Se non è ancora arrivata nessuna risposta, semplicemente non ha
senso chiedersi quale sia il suo stato. In questo caso, un problema
sarebbe: come faccio a sapere che non è ancora arrivata nessuna risposta,
dato che readyState non mi dà informazioni a riguardo?


 dato che readyState non mi dà informazioni a riguardo?
Dici? Rileggi un po' quello che hai scritto in questo thread (non post,
thread).
-- 
- Se tu un Dio?
- N...no.
- E allora MUORI!
- Ray, se qualcuno ti chiede se sei un Dio, tu devi rispondere di sì!

 thread).
Uhmmaro', ho scritto un sacco di cose :)
Allora, l'unica cosa che mi viene in mente è il discorso fatto non tanto
sul valore finale di readyState, ma sulla sua "storia" nel corso della
richiesta: alla mia domanda "si può verificare se readyState abbia assunto
il valore 2", però, tu avevi risposto "no".
Un'altra cosa... per responseText e responseXML leggo che sono "NULL if the
request is unsuccessful or has not yet been sent": può essere utile questa
cosa?


 il valore 2", però, tu avevi risposto "no".
Infatti. Ma vedrò di darti una mano. In parte sono cose che ti ho già detto, e
volevo evitare di essere così chiaro. Come ti ho detto, preferivo facessi
tutto da solo.
Non capisco perché ti sei fissato proprio sul valore 2. Prova a fare una
richiesta rimanendo sulla pagina, ed una cambiandola immediatamente, e
verifica i valori di stato che ti appaiono. Rileggiti la reference su ciò che
concerne i valori che può assumere readyState.
E tira le somme.


 E tira le somme.
Allora... sono certo che hai rivisto il test, ma scrivo comunque qui perché
mi aiuta...
[Richiesta senza cambio pagina]
status: inaccessibile; readystate: 1
status: 200; readystate: 2
status: 200; readystate: 3 (per una o più volte, a seconda del ritardo sul
server)
status: 200; readystate: 4
[Richiesta con cambio pagina subito o quasi subito]
status: inaccessibile; readystate: 1
status: inaccessibile; readystate: 2
status: inaccessibile; readystate: 4
[Richiesta con cambio pagina dopo un po']
status: inaccessibile; readystate: 1
status: 200; readystate: 2
status: 200; readystate: 3
status: 200; readystate: 4
Il cambio pagina lo posso effettuare subito o dopo un po'... se lo faccio
subito (o comunque lo faccio partire presto, relativamente alla velocità di
comunicazione con il server) allora status resta inaccessibile e readystate
non assume mai il valore 3; se invece il cambio pagina avviene dopo un
tempo sufficientemente ampio, allora status è accessibile e readystate
assume anche il valore 3. Questa la reference riguardo a readystate che si
trova su xulplanet:
Possible values: 0 UNINITIALIZED open() has not been called yet. 1 LOADING
send() has not been called yet. 2 LOADED send() has been called, headers
and status are available. 3 INTERACTIVE Downloading, responseText holds the
partial data. 4 COMPLETED Finished with all operations.
(NB nota che la reference dice anche che, quando readystate vale 2, gli
headers e lo status sono disponibili)
La reference associa al valore 3 la dicitura "INTERACTIVE": dunque, se
readystate assume il valore 3 si può essere certi che la risposta dal
server ha iniziato ad arrivare (non è detto che sia completa, lo sarà
quando readystate varrà 4).
Sembra che vi sia una corrispondenza: readystate non assume mai il valore 3
=> non vi è mai interazione col server => status non è disponibile (proprio
perché il server non ha potuto rispondere in alcun modo)
E fanculo alla sintesi!


 headers e lo status sono disponibili)
Mi riferivo alla reference originale, ovvero quella di MSXML.


 serviva sotto il naso.
E ca**o, l'avevo detto ma erroneamente indicando "2" invece di "3" come
valore di readyState da "verificare"... mavafanc... ehm.
Mi scuso per averti portato all'esasperazione :)


 Mi scuso per averti portato all'esasperazione :)
E di che, del resto te l'ho lasciato fare. Potevo benissimo dirti subito
come stavano le cose. In verità, temo di essere io quello che ha portato
all'esasperazione te. :)


 all'esasperazione te. :)
Un po' sì... però so quanto sono pigro: il dilungarsi del discorso mi ha
"costretto" ad approfondire cose che altrimenti non avrei capito. Di
questo, /tutto sommato/ (*eg*), devo ringraziarti :)
Quasi quasi dimenticavo un altro paio di quesiti "sospesi"... uno
riguardante il setInterval (questione sulla quale sei sempre stato assai
laconico, anche con altri che ti chiedevano delucidazioni), un altro
riguardante il modo "giusto" di sostituire, in una stringa, tutti i
caratteri appartenenti a un set di caratteri speciali con i rispettivi
codici unicode.
Ma queste sono altre storie... e altri thread :)


 codici unicode.
Ricordi male: non era il modo "giusto", era un modo alternativo ad una
"catena di replace", che potesse funzionare anche su uno script engine
inferiore alla versione 5.5.
Tu hai gettato la spugna, non pretenderai che ti dica a cosa alludevo.


 codici unicode.
Ricordi male: non era il modo "giusto", era un modo alternativo ad una
"catena di replace", che potesse funzionare anche su uno script engine
inferiore alla versione 5.5.
Tu hai gettato la spugna, non pretenderai che ti dica a cosa alludevo.
-- 


 Tu hai gettato la spugna, non pretenderai che ti dica a cosa alludevo.
No, no, davvero. Ho gettato "temporaneamente" la spugna, ho intenzione di
spulciare ancora un po' la reference. Se impazzirň, chiederň aiuto. Ma
prima ci provo.


 poi te lo posto.
Rettifico. Torvato quel thread, non c'č traccia di ciň che dicevo.
Evidentemente mi si sono intrecciati i pensieri nella testa e l'ordine
temporale delle idee č saltato.
Ammetto le mie colpe, avevo individuato nel valore 2 la soluzione del
problema perché sono fesso e basta :)
Amen.


 risposta.
Vabbuò, è ora che mi curi. Il post che ricordavo è questo:
http://groups.google.it/group/it.comp.lang.javascript/msg/7bda10b5024c400f?hl=it
L'ho detto che mi si intrecciano i pensieri.
Arrivedorci.
