Visualizzazione dei risultati da 1 a 8 su 8

Discussione: Closure in Ajax?

  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2004
    Messaggi
    45

    Closure in Ajax?

    Salve ragazzi, ho un quesito.

    E' possibile restituire la variabile responseTXT nella stessa funzione chiamante?

    Codice PHP:
    function main() {
    var 
    data 0//variabile da assegnare a responseTXT
    sendAjax(null"file.php"callback); //callback dovrebbe essere una closure che restituisce responseTXT
    alert(data);
    }
    // e ora la funzione sendAjax
    function sendAjax(dataurlcallback) {
        var 
    request createXMLHttpRequest();
        if(
    request) {
            
    request.open("post"urltrue);
            
    request.setRequestHeader("content-type""application/x-www-form-urlencoded"); 
            
    request.onreadystatechange = function() {
                if (
    request.readyState == 4) {
                    if (
    request.status == 200) {
                        
    callback(request);
                    } else {
                        
    alert("Il server ha restituito un errore: " request.responseText);
                    }
                }
            }
            if(
    data) {                          
                
    request.send(data);
            } else {
                
    request.send(null);
            }
        }

    Praticamente il mio intento è eseguire la sendAjax e fare in modo che assegni responseTXT alla variabile esterna data, è possibile, ho provato con una closure function ma non funziona, probabilmente sbaglio io qualcosa.

  2. #2
    Frontend samurai L'avatar di fcaldera
    Registrato dal
    Feb 2003
    Messaggi
    12,924
    codice:
    function main() {
    var data = sendAjax(null, "file.php");  
    alert(data);
    }
    // e ora la funzione sendAjax
    function sendAjax(data, url) {
        var request = createXMLHttpRequest();
        if(request) {
            request.open("post", url, true);
            request.setRequestHeader("content-type", "application/x-www-form-urlencoded");
            request.onreadystatechange = function() {
                if (request.readyState == 4) {
                    if (request.status == 200 || request.status == 304) {
                       return request.responseText;
                    } else {
                        alert("Il server ha restituito un errore: " + request.responseText);
                       return false;
                    }
                }
            }
            if(data) {                          
                request.send(data);
            } else {
                request.send(null);
            }
        }
    }
    Vuoi aiutare la riforestazione responsabile?

    Iscriviti a Ecologi e inizia a rimuovere la tua impronta ecologica (30 alberi extra usando il referral)

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2004
    Messaggi
    45
    Grazie fcaldera, nel frattempo ho trovato questa soluzione ma ha un comportamento strano.

    Codice PHP:
    function main() {
         var 
    datacount 0;
         
    sendAjax(null"file.php"countData);
         function 
    countData(request) {
              
    datacount request.responseText;
         }
         
    alert(datacount);

    La cosa strana è che in esecuzione normale su firefox alert mi restituisce "0", mentre eseguendo con Firebug passo dopo passo mi restituisce 60!! che è il risultato giusto!!!

    Cosa sbaglio? è un problema di asincronia?

  4. #4
    Frontend samurai L'avatar di fcaldera
    Registrato dal
    Feb 2003
    Messaggi
    12,924
    a rivedere quello che ho scritto credo che dovrei bere più caffè al mattino
    stai facendo una chiamata asincrona io l'ho trattata come sincrona.

    scrivila così, dovrebbe andare.

    codice:
    function main(data) {
       alert(data);
    }
    
    // e ora la funzione sendAjax
    function sendAjax(data, url, callback) {
        var request = createXMLHttpRequest();
        if(request) {
            request.open("post", url, true);
            request.setRequestHeader("content-type", "application/x-www-form-urlencoded");
            request.onreadystatechange = function() {
                if (request.readyState == 4) {
                    if (request.status == 200 || request.status == 304) {
                        callback(request.responseText);
                    } else {
                        alert("Il server ha restituito un errore: " + request.responseText);
                    }
                }
            }
            if(data) {                          
                request.send(data);
            } else {
                request.send(null);
            }
        }
    }
    
    sendAjax(null, "file.php", main);
    Vuoi aiutare la riforestazione responsabile?

    Iscriviti a Ecologi e inizia a rimuovere la tua impronta ecologica (30 alberi extra usando il referral)

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2004
    Messaggi
    45
    Niente da fare, entrambe le nostre soluzioni funzionano, datacount riceve il valore giusto ma è un problema di asincronia, l'alert viene fatto prima che arrivi la risposta dal server, ne sono sicuro,infatti risponde sempre 0, poi non capisco perchè con firebug andando passo per passo funziona!

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2004
    Messaggi
    45
    Ma dato che il file lato server non fa altro che fare un count(id) in un database, quindi un 'operazione molto veloce, non capisco come mai questa latenza, mi viene da pensare che tutti allora hanno questo tipo di problema con ajax, come fanno?

  7. #7
    Frontend samurai L'avatar di fcaldera
    Registrato dal
    Feb 2003
    Messaggi
    12,924
    sei sicuro di aver copiato esattamente quello che ti ho postato per ultimo?
    Vuoi aiutare la riforestazione responsabile?

    Iscriviti a Ecologi e inizia a rimuovere la tua impronta ecologica (30 alberi extra usando il referral)

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2004
    Messaggi
    45
    Si si fcaldera, infatti ripeto, la tua funzione dà il risultato giusto così come la mia closure, ma funzionano solo con firebug attivo e andando passo per passo, e poi il responseText non mi serve nello scope della callback ma nello scope della funzione/script che ha chiamato sendAjax.

    Codice PHP:
    function init() {
         var 
    count 0;
         function 
    retResponse(responso) {
              
    count responso;
         }
         
    sendAjax(null"file.php"retResponse);
         
    alert(count); // qui firefox dà sempre 0 ma con firebug attivo dà il ris giusto


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 © 2024 vBulletin Solutions, Inc. All rights reserved.