Newsgroup: it.comp.lang.javascript
Titolo: problemino con il valore di ritorno di una funzione

Salve,
ho un piccolo problema con il ritorno dei dati da parte di una
funzione in javascript che invia richieste asincrone
vi spiego meglio...
allora, attraverso un pulsante io lancio questa funzione
function esecuzione(){
    //pagina da interrogare
    var stringa = "save.php";
    //funzione che interroga la pagina
    var result_final = save_general(stringa);
    //attraverso questo alert voglio che mi venga mostrato il
risultato della funzione attraverso il return
    alert(result_final);
    return false;
}
function save_general(pagina_salvataggio) {
    var maxSecondsWait = 10;
    var timeOutCheckWait = 500;
    var dataChiamata = new Date();
    var inizioChiamata = dataChiamata.getTime();
    var verificaTempoTrascorso;
    var checkWaitInitialized = false;
    var maxWait;
    var risultato_finale;
    myRequest = CreateXmlHttpReq();
    myRequest.open("GET", pagina_salvataggio);
    myRequest.setRequestHeader("connection", "close");
    myRequest.onreadystatechange = function() {
        if (myRequest.readyState === 4) {
            verificaTempoTrascorso = function(){};
                if (myRequest.status == 200){
                    risultato_finale = myRequest.responseText;
                    document.getElementById("div_p").innerHTML =
risultato_finale;
                }else{
                    alert("errore");
                }
        }else if (! checkWaitInitialized) {
            maxWait = maxSecondsWait * 1000;
              verificaTempoTrascorso = function() {
            dataChiamata = new Date();
                if((dataChiamata.getTime() - inizioChiamata) >
maxWait) {
                    //tempo scaduto!!
                    myRequest.onreadystatechange = function()
{return;};
                    myRequest.abort();
                    alert("errore");
                } else
                      setTimeout(verificaTempoTrascorso,
timeOutCheckWait);
              };
              verificaTempoTrascorso();
              checkWaitInitialized = true;
        };
    };
    myRequest.send(null);
    return risultato_finale;
}
come potete vedere dalla seconda porzione di codice, in caso di
myRequest.status == 200, stampo all'interno di un div il
myRequest.responseText e fin qui non ci sono problemi, ottengo
perfettamente il valore dalla pagina php... a questo punto vorrei che
myRequest.responseText mi venga ritornato alla fine della funzione
(return risultato_finale) e invece non ottengo altro che un undefined.
Sapreste dirmi per quale motivo questo valore non vuole passare
ho fatto un piccolo esempio cosicchè potete provarlo. Come potete
vedere dall'esempio, una volta cliccato sul pulsante, sul div mi viene
stampato corretamente il valore passatomi dalla pagina php, mentre
nell'alert ottengo un undefined e invece vorrei ottenere lo stesso
valore stampato sul div
http://lnx.ampsrl.net/ajax.zip

 Sapreste dirmi per quale motivo questo valore non vuole passare
L'hai detto tu stesso, perche` fai una richiesta asincrona. :) Quando
esegui una richiesta asincrona, il codice non aspetta la risposta dal
server (la risposta viene difatti gestita nell'onreadystatechange); e
quindi esci dalla funzione *prima* che risultato_finale venga settata
dalla closure che hai fatto.
E non avendo definito alcun valore di default nella dichiarazione, la
variabile risulta "undefined" appunto.
-- 
"When you have eliminated the impossible, whatever remains, however
improbable, must be the truth."

 wrote:

e non sai consigliarmi uno stratagemma o qualcosa del genere per far
arrivare il valore, o per far si che la funziona attenda che
onreadystatechange finisca??

 onreadystatechange finisca??
Mi dai l'impressione di avere le idee un poco confuse sulla questione
sincrona/asincrona e modello event driven.
Semplificando: No, non esiste uno "stratagemma" per far diventare una
chiamata asincrona, sincrona. Se desideri una chiamata "sincrona" fai
una chiamata "sincrona" (con tutto cio` che ne consegue, ovviamente),
non ne fai una asincrona. :)


 onreadystatechange finisca??
Ho postato giorni fa (titolo: Ajax - Consigli) dove i consigli li chiedevo
mentre mi pare risolvano il caso tuo.
Prova a usare la funzione getContent che al ricevimento del valore esegue
una funzione che appunto ti permette di gestire una chiamata asincrona
gestendone il risultato.
Non sono per nulla esperto e chiedevo un parare proprio per capire se la
soluzione puo' essere almeno "passabile".
In ogni caso... funziona...
Felice programmazione a tutti
Max

 Max
A quest'ora, piu` che programmare, spero di dormire. ;)



[cut]
Si ho fatto pasticcio scusami... sono diventato nonno l'altro ieri e non mi 
sono ancora ripreso!!!
Bnotte scusa ancora 

 Bnotte scusa ancora
Notte anche a te, e stai sereno che non hai fatto alcun danno. :)
