Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    70

    ajax e readystate 4 che non arriva mai

    ho notato che è possibile che, nell'attesa del readystate 4 da parte dello script, questo non arrivi in tempi brevi, ma manco medi.
    metti un problemino di intasamento del server, metti un calo di efficienza della nostra linea.. il PHP che sta elaborando e per qualche motivo ci mette una vita e mezza.
    si può simulare per esempio con uno sleep(3000) , per esempio.

    non ho trovato nulla a riguardo: come posso fare per far si che dopo un tot di tempo la funzione smetta di aspettare il readystate 4 e prosegua , per esempio outputtando un errore, o facendo addirittura semplicemente ripartire la funz. automaticamente?

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    70
    riprovo a destare interesse.
    posto l'esempio classico:

    codice:
    function cambiapagina(id) {
    if(timer)clearTimeout(timer);    
    var r = Math.random();
    myRequest = CreateXmlHttpReq();
    var url="pippo.php?Dir="+id+"&rand="+escape(r) ;
    myRequest.open("GET", url , true)
    
    myRequest.onreadystatechange=function(){
    	
    	if (myRequest.readyState==4 || myRequest.readyState=="complete"){
                    if (myRequest.status == 200){
                    document.body.style.cursor = "auto";
                    output = myRequest.responseText.split('-_-_-');
                    var tipochat = output[3];
    		document.getElementById('principale').innerHTML = output[0];		
    		variabilivelocistart();
    					if (tipochat == 2) {
    					document.getElementById('chatbarText').focus();
    					prenditesto('1');
    					}
    		} else {
    		document.body.style.cursor = "auto"; 
    		document.getElementById('principale').innerHTML="ERRORE "+myRequest.status;
    				variabilivelocistart();
    		}
    	} else {
    		document.body.style.cursor = "wait";
    	} 
    		
    }
    
    myRequest.send(null);
    }

    se la pagina pippo.php non risponde per qualche strano intasamento, il readystate4 non arriva mai.
    come posso far si che dopo TOT tempo comunque la funzione si esegue? (e non ricevendo status 200, scriva quindi errore?)

  3. #3
    Moderatore di Annunci siti web, Offro lavoro/collaborazione, Cerco lavoro L'avatar di cavicchiandrea
    Registrato dal
    Aug 2001
    Messaggi
    26,133
    Non sono un esperto, pertanto prendi il "consiglio" col beneficio del dubbio, per esperienza personale me capitato di cercare l'errore lato client (in questo caso ajax) invece era lato server.
    Pertanto io procederei cosi pagina semplice tipo <?php eco="Testo prova"?> (non conosco il php forse ho scritto una c#####a) lato server richiamata da uno script ajax base (no preload no attese etc...) e verifichi cosa stampa a video, poi ricreerei un errore e vedo cosa stampa con "responseText"
    tratto dalla giuda html.it:
    Lo scopo del parametro responseText è infatti quello di poter ricevere comunque informazioni dal server.
    che trovi QUI
    Cavicchi Andrea
    Problemi con javascript, jquery, ajax clicca qui

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    70
    quello ok, infatti se guardi lo script , printo un "errore" nel caso he all'arrivo dello statement 4 lo status non sia 200.
    quindi se fosse 404 (pagina non trovata), 501, ecc ecc mi viene risposto errore.

    il mio problema è se invece lo statement 4 non arriva mai!

    e cioè, simulandolo in modo assurdo, se mettessi un sleep(300000); nel php.

    io vorrei che comunque la funzione in locale, dopo magari 20 , 30 secondi, riparta da capo, senza aspettare all'infinito l'arrivo del readystate 4.

  5. #5
    Moderatore di Annunci siti web, Offro lavoro/collaborazione, Cerco lavoro L'avatar di cavicchiandrea
    Registrato dal
    Aug 2001
    Messaggi
    26,133
    Premesso che era solo un consiglio, e che dallo script posto non mi sembrava una cosa cosi banale (ma non conoscendo benissimo il linguaggio potrei sbagliarmi io) nel link postato (che non ho capito se l'hai letto) si tratta proprio l'argomento in modo dettagliato, e nella pagina successiva come "stoppare" una chiamata ajax qui lascio a qualcuno più ferrato di me la possibilità d'aiutarti.


    Edit: nella guida ho letto che verificano stato 4 cosi:
    codice:
    if(ajax.readyState === 4)
    con 3 uguali, potrebbe essere la tua soluzione
    Cavicchi Andrea
    Problemi con javascript, jquery, ajax clicca qui

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    70
    si si ho letto, ma è una guida che avevo già seguito.

    infatti io seguo il ragionamento che fa la guida: infatti ho

    codice:
    if (myRequest.readyState==4 || myRequest.readyState=="complete"){
    la mia ipotesi, è che il server resti sullo stato 3, per qualche motivo.

    e io voglio semplicemente ottenere, che dopo TOT tempo che il server resta sul 3, la funzione si azzeri e rimandi un'ulteriore richiesta al server.

    Così come è attualmente, non lo fa. La funzione resta in perenne attesa (sempre nel caso raro che il server per qualche motivo non risponda)

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    70
    avrei provato questa soluzione ma ha un comportamento strano con Explorer:


    codice:
    ......
    ......
    myRequest.open("GET", ......................);
        myRequest.send(null);
        var timer = setTimeout('prenditesto();',20000);
    	       
           myRequest.onreadystatechange=function(){
    
    	        if  (myRequest.readyState==4 && timer<15000 )  {
                    if (myRequest.status == 200) {
            			...bla bla bla scrive azioni in chat ...	
    				} else {
    				document.getElementById("outputList").innerHTML +="ERRORE "+myRequest.status;
    				}
    	
    		} else  prenditesto(); 
    	}
    Ho un timeout dove ripete la stessa funzione ogni 20 secondi.
    ho aggiunto accanto alla condizione del readystate 4 la condizione che la variabile timer sia inferiore a 15 secondi.Quindi, se al 15° secondo non è ancora arrivato lo stato 4, lui dovrebbe far ripartire la funzione.

    il problema è che mentre con Firefox funzia, Explorer NON da errore, ma NON ritiene vera la condizione.

    infatti se per debug all'ultimo else invece della funzione gli faccio scrivere i readystate (lui mi scrive in chat 1 2 3 ecc ad ogni cambio stato):
    codice:
    else document.getElementById("outputList").innerHTML += myRequest.readyState+"
    ";
    ..con explorer mi scrive anche il "4", segno che ha ritenuta falsa la condizione del timer<15000. Firefox invece la ritiene giusta e mi fa l'output corretto =_=

    perché tutto questo? c'è un errore di sintassi (la console non mi dice nulla, e manco explorer)

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.