Newsgroup: it.comp.lang.javascript
Titolo: programmazione asincrona

salve.
ho una pagina nella quale devo caricare diversi oggetti da pagine
esterne in modo asincrono in parallelo.
Ho fatto questo script:
<script>
function riempiobj(objid,testo){
        var obj = document.getElementById(objid);
        obj.innerHTML = testo;
}
function checkcons(ist,div){
        var XMLHttpRequestObject = false;
        if (window.XMLHttpRequest){
                XMLHttpRequestObject = new XMLHttpRequest();
        } else
        if (window.ActiveXObject){
                XMLHttpRequestObject = new
ActiveXObject("Microsoft.XMLHTTP");
        }
        if (XMLHttpRequestObject){
                XMLHttpRequestObject.open("GET", 'ajax.php?ist='+ist);
                XMLHttpRequestObject.onreadystatechange = function(){
                        if (XMLHttpRequestObject.readyState == 4 &&
XMLHttpRequestObject.status==200)
 
{ riempiobj(div,XMLHttpRequestObject.responseText); }
                }
                XMLHttpRequestObject.send(null);
        }
}
</script>
<div id='div0'></div>
<div id='div1'></div>
<div id='div2'></div>
<div id='div3'></div>
<script>
checkcons(0,'div0');
checkcons(1,'div1');
checkcons(2,'div2');
checkcons(3,'div3');
</script>
questo semplice script riempe i 4 div con l'output di
ajax.php?ist=0
ajax.php?ist=1
ajax.php?ist=2
ajax.php?ist=3
ognuno di questi comandi può impiegare 2/3 secondi e questi div
possono essere ben più di 4.
Il problema è che con lo script così fatto i comandi vengono eseguiti
non in parallelo, quindi l'ultimo lo vedo dopo anche un minuto, su
firefox.
Su internet exproler è peggio... se sulla pagina è presente un link
devo aspettare che gli script terminino tutti prima di poter cliccare.
C'è una soluzione?
Ciao,
Matteo

                 XMLHttpRequestObject.open("GET", 'ajax.php?ist='+ist);
la chiamata non mi sembra affatto asincrona: se ad open non passi il terzo
parametro true (o equivalente), la richiesta e' *sincrona*
-- 
Increased cost of life? Eat plasma panels!


mmm. che io mi ricordi true era il default (ma posso sbagliarmi).
Matteo


evidentemente ho frainteso il senso di "in parallelo" del tuo post
originale.
-- 
Local candidates only, no relocation

 </script>
domanda: stai eseguendo le chiamate "AJAX" in linea cosi' come nel
codice qui sopra, e non dopo il caricamento del DOM?


 codice qui sopra, e non dopo il caricamento del DOM?
non ho ben capito la domanda... quello è il codice esatto che ho
scritto (solo che le chiamate non sono 4 ma un po' di più).
Matteo

comunque devo rivedere bene il sistema, in quanto forse non è proprio
vero che non li esegue in parallelo... forse essendo tante non me le
esegue tutte, in parallelo, o forse la risposta non ha il massimo
parallelismo (forse il server ha un limite basso di richieste
simultanee nel file di configurazione).
purtroppo ora, carenza di tempo a parte, ho il server down almeno fino
a lunedì sera, e non posso quindi fare verifiche.
Matteo

 scritto (solo che le chiamate non sono 4 ma un po' di piů).
se effettui manipolazioni del DOM (ovvero il modello a oggetti del
documento) prima del caricamento dell'intera pagina, i risultati sono
nella migliore ipotesi imprevedibili. Meglio attendere il caricamento
del documento e poi effettuare le chiamate:
<head>
<script>
function check_all()
{
  checkcons(0,'div0');
  checkcons(1,'div1');
}
</script>
</head>
<body onload="check_all()">
<div id='div0'></div>
<div id='div1'></div>
</body>


<body onload="check_all()">
Ma il metodo onload di body parte alla FINE del caricamento della
pagina?
(sono quasi riuscito a tirare su il server ;-)
Matteo

 pagina?
body onload è semplicemente una rimappatura di window.onload.
per le specifiche vedi qua:
 
http://developer.mozilla.org/en/docs/DOM:window.onload
 "The load event fires at the end of the document loading process. At this
point, all of the objects in the document are in the DOM, and all the
images and sub-frames have finished loading"
-- 
"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.

 pagina?
Premesso quanto già ti ha detto Cristiano, che tra l'altro ti evita di
mischiare più del dovuto HTML e JS, la risposta è "si".
L'onload è spesso frainteso: viene scatenato quando la pagina, risorse
comprese, è stata completamente caricata e NON quando il codice HTML è
stato interpretato dal browser (evento che accade molto prima, ovvio).
Quindi, se hai risorse molto grandi (esempio, immagini), oppure frame,
fintanto che il browser non ha ricevuto tutto, l'onload non parte.
Delle volte è utile. Delle altre, fa sorgere complicazioni. Perché, se
devi manipolare oggetti DOM, spesso è volentieri prima lo fai e meglio
è.
A tal proposito, esiste un evento molto discusso: il DOMContentLoaded.
Discusso perché sfortunatamente non è molto crossbrowser. :) Ma la sua
utilità è fuori ogni dubbio.
Praticamente ogni framework JS a giro ha un suo metodo per rendere più
crossbrowser possibile questo evento (mi ricorda i tempi di IE4/NS4) e
c'è da dire che noi italiani ci siamo "distinti" nel trovare una buona
soluzione per IE, e per questo va ringraziato Diego Perini:
 
http://javascript.nwbox.com/IEContentLoaded/
Ti suggerisco di approfondire la questione.
-- 
~ Tenete la morte lontano dalle strade. Guidate sul marciapiede.

> <body onload="check_all()">
La velocità è quasi la stessa, ma il parallelismo si fa decisamente
vedere.
Testato su firefox (non ho IE a disposizione)
poi con un po' di tempo mi vedrò tutte quelle cose che mi avete
consigliato di vedere.
Grazie,
Matteo