Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    chiamata xmlhttp: utilizzare risultato responseText fuori dall'ev onreadystatechange

    Ciao,
    ho un problema che mi assilla e ho bisogno di un aiutino.
    Ho scritto una serie di funzioni per farmi ritornare un albero xml da una pagina asp.

    In una mia classe js ho il seguente metodo per l'invio della richiesta:

    codice:
        this.SendRequest = function() 
        {
            var xmlhttp = getXMLHttp();
            var result = null;
            
            xmlhttp.open("POST", strPath, true);
            
            xmlhttp.onreadystatechange=function() 
            {
                if (xmlhttp.readyState==4) 
                {
                    if(xmlhttp.status==200)
                    {
                        result = xmlhttp.responseText;
                    }
                    else
                    {
                        result = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>"+
                            "<root><error><number>"+xmlhttp.status+"</number>"+
                            "<description>"+xmlhttp.statusText+"</description>"+
                            "<source>xmlhttp request</source></error></root>";
                    }
                    
                    //alert(result);
                }
            };
            
            xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
            xmlhttp.send("sql="+escape(self.sql));
    
            return result;
        };
    allora, il mio problema è che la funzione SendRequest ritorna sempre un null quando la chiamo dall'interno della mia funzione, sebbene l'alert commentato nell'onreadystatechange restituisca correttamente il mio codice xml.
    Adesso, il problema mi pare chiaro, l'evento onreadystatechange viene scatenato dopo che io utilizzo il valore di ritorno della funzione SendRequest..
    Esiste un modo per far si che questo non accada? ossia, posso far ritornare alla funzione il valore che vado a pescarmi via xmlhttp, chessò, mettendo in sleep la funzione o in qualche altro modo legale o illegale?
    So che mettendo tutto il mio codice dentro l'onreadystatechange tutto funziona, ma mi fa decisamente schifo e inoltre questo mi limiterebbe la riusabilità della classe, dato che dovrei ogni volta modificare una sua funzione per adattarla alle nuove esigenze.

    Spero di essermi spiegato, grazie a chi mi saprà illuminare


    xxx

  2. #2
    per chi è interessato per ora ho risolto facendo una chiamata sincrona, ma se ci sono suggerimenti in merito sono ben accetti

    xxx

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    209
    la soluzione è usare la libreria Prototype, ma se proprio vuoi un suggerimento per completare la funzione, this non capisco cosa sia..., se è una "classe" che non vuoi fare vedere, dovresti usare degli eventi che si riferiscono a una closure posta nell'onreadystatechange che ti interessa di più...tipo il successo o l'errore

  4. #4
    Ciao e grazie per la risposta.
    la funzione sopra, SendRequest, fa parte di una classe, e volendo referenziare il metodo come "pubblico" l'ho dichiarato in quel modo.
    nell'ultima versione comunque l'ho riportato a:
    codice:
    function SendRequest()
    {
        ...
    }
    e ho fatto (come dicevo sopra) una chiamata sincrona, eliminando l'onreadystatechange.

    Riguardo la libreria Prototype (e a come usarla per risolvere il mio problema) sapresti dirmi qualcosa in più per favore? La cosa mi interessa molto.
    Conviene secondo te passare a questa soluzione?

    xxx

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    209
    Nessuno ti dirà mai qual'è il miglior framework js, ma tutti sanno che Prototype è il MIGLIOR framework Lo puoi unire a script.aculo.us e non preoccuparti per il peso, se cerchi in giro trovi chi li ha uniti sotto nome di protoculous e compressi moltissimo passando da 140k a 30k, o giù di lì.

    Comunque nel sito trovi la documentazione delle API di Prototype e per fare una richiesta AJAX puoi ricorrere a vari metodi specialistici, quello che interessa a te è:

    new Ajax.Request('pagina.asp',{method:'post',postBody: 'x=1&y=2',onSuccess:function(t){
    ...
    }});

    t è l'oggetto che rappresenta la risposta (t -> transport)

    t.responseText è il risultato della chiamata ad esempio, ma ti invito a documentarti, se pensi di dovere usare js massivamente, non ti sarà certo dannoso sapere anche tutte le altre funzionalità.

    Ciaooooo

  6. #6
    Azz, così a prima vista il framework sembra veramente sensazionale (e anche scriptaculous coi suoi effetti)
    Per ciò a cui sto lavorando ora tuttavia mi pare superfluo, tanto più che per ottenere ciò che mi serve devo comunque fare una Ajax.Request sincrona.
    Resta il fatto che vale la pena studiarseli, grazie per i suggerimenti!

    xxx

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.