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

    [AJAX] "undefined" per richieste lente

    ciao, sto cercando di capirci meglio sul discorso del javascript asincrono (che da hobbysta ho scoperto ora, ma che ho a lungo immaginato dovesse essere inventato)...

    ho un problema banale ma il mio js è arrugginito.

    In caso di script (php) che richiede tempo, ricevo responseText "undefined", pur essendo il readyState=4 e lo status=200. alché mi chiedo quand'è che realmente servono, cmq, come faccio a dire alla funzione che fa questi controlli di "aspettare" un valore testuale, poi restituire il risultato?

    forse con un Interval?

    (mi serve una mano :| )

    ciao,
    jack.

  2. #2
    Frontend samurai L'avatar di fcaldera
    Registrato dal
    Feb 2003
    Messaggi
    12,924
    dovrebbe essere sufficiente impostare una connessione sincrona
    quando usi il metodo open dell'oggetto XMLHTTPRequest. Se obj è il tuo oggetto allora

    obj.open(metodo, url, async);

    In altre parole il terzo parametro deve essere false.

    Vuoi aiutare la riforestazione responsabile?

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

  3. #3
    dunque, io uso queste 2 semplici funzioni che ho "montato" guardando i tutorial e una reference.
    codice:
    var http_request = null; 
    
    function httpMakeRequest(url) 
    { 
    	if (http_request != null && http_request.readyState != 0 && http_request.readyState != 4)
    		http_request.abort();
    	
    	if (window.XMLHttpRequest)
    	{
    		http_request = new XMLHttpRequest(); 
    		if (http_request.overrideMimeType) { 
    		http_request.overrideMimeType('text/xml'); 
    		} 
    	}
    	else if (window.ActiveXObject) {
    		try { 
    			http_request = new ActiveXObject("Msxml2.XMLHTTP"); 
    		} catch (e){
    			try { 
    				http_request = new ActiveXObject("Microsoft.XMLHTTP"); 
    			} catch (e) {} 
    		} 
    	} 
    	
    	if (!http_request) { 
    		alert('Your browser does not support HTTP requests.'); 
    		return false; 
    	} 
    	
    	http_request.open('GET', url, true);
    	http_request.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
    	http_request.onreadystatechange = httpGetResponse;
    	http_request.send(null); 
    }
    
    function httpGetResponse()
    {
           if (http_request.readyState == 4) { 
               if (http_request.status == 200) {
               	
               	return http_request.responseText;
               } else { 
                   alert('Unable to retrive HTTP data.\n\n(#' + http_request.status + ') ' + http_request.statusText);
               } 
           }
    }
    la richiesta nello specifico è ad uno script php che mi restituisce un host con un timeout settato in caso di fallimento, ma un po' di tempo è pur sempre richiesto.

    così se chiamo:
    codice:
    httpMakeRequest('host.php?ip=63.33.131.123');
    alert(httpGetResponse());
    mi restituisce undefined. come faccio a dire alla funzione js httpGetResponse() di aspettare a fare il return finché è undefined?

  4. #4
    Frontend samurai L'avatar di fcaldera
    Registrato dal
    Feb 2003
    Messaggi
    12,924
    intanto prova questo...

    al posto di
    http_request.open('GET', url, true);

    scrivi
    http_request.open('GET', url, false);

    mentre io continuo a dargli un occhio...


    Vuoi aiutare la riforestazione responsabile?

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

  5. #5
    Frontend samurai L'avatar di fcaldera
    Registrato dal
    Feb 2003
    Messaggi
    12,924
    scusa, non puoi mettere l'alert qui?

    codice:
    function httpGetResponse()
    {
           if (http_request.readyState == 4) { 
               if (http_request.status == 200) {
               	
                 alert(http_request.responseText)
        	     return http_request.responseText;
               } else { 
                   alert('Unable to retrive HTTP data.\n\n(#' + http_request.status + ') ' + http_request.statusText);
               } 
           }
    }
    Vuoi aiutare la riforestazione responsabile?

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

  6. #6
    ho provato già con true.

    l'alert non posso metterlo lì perchè devo manipolare i dati prima di usarli, quella funzione mi dovrebbe restituire il responso, ma non va a dovere...

  7. #7
    up

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