Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di Teuzzo
    Registrato dal
    Mar 2002
    Messaggi
    969

    [ajax] Abortire chiamata asincrona

    Al caricamento di un pagina lancio una chiamata ajax per caricare un div.
    Questa chiamata esegue uno script in modo asincrono molto complesso che potrebbe richiedere molti secondi (anche minuti a volte).
    Il problema è che quando l'utente non vuole aspettare il caricamento di quei dati e vuole cambiare pagina, ad esempio cliccando su un link, il browser non risponde fino a quando la chiamata ajax non viene conclusa.
    Vorrei capire come abortire la chiamata.
    Ho provato ad usare il metodo abort() ma non ho ottenuto i risultati voluti.
    Questo è lo scripte che uso:

    codice:
    <script>
        // funzione per abortire la chiamata
        function abortAjax(xhr) {
            if(xhr && xhr.readystate != 4){
                xhr.abort();
                $("#divDati").html('Chiamata stoppata');
            }
        }
        
    
    
        $(document).ready(function(){
            xhr = $.ajax({
                url : "scriptPesante.php",
                data : { 'id1':'1', 'id2':'2' },
                type :  "GET",
                success : function (data,stato) {
                    $("#divDati").html(data);
                },
                error : function (richiesta,stato,errori) {
                    alert("Errore. Stato della chiamata: "+stato);
                }
            });
        
            // funzione per abortire la chiamata
            $("#btnAbort").click(function(){
                abortAjax(xhr);
            });
    
    
        });
    </script>
    Quando clicco sul bottone #btnAbort la chiamata sembra effettivamente abortita, infatti i dati non vengono caricati e appare la scritta "Chiamata stoppata", però se cerco di fare altre operazioni il browser rimane bloccato fino a quando probabilmente lato server la chiamata non è terminata.
    Qualche idea?

  2. #2
    Moderatore di Annunci siti web, Offro lavoro/collaborazione, Cerco lavoro L'avatar di cavicchiandrea
    Registrato dal
    Aug 2001
    Messaggi
    26,133
    Cavicchi Andrea
    Problemi con javascript, jquery, ajax clicca qui

  3. #3
    Utente di HTML.it L'avatar di Teuzzo
    Registrato dal
    Mar 2002
    Messaggi
    969
    Nessuna soluzione? Troppo complicato?

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    3,660
    Il problema è che quando l'utente non vuole aspettare il caricamento di quei dati e vuole cambiare pagina, ad esempio cliccando su un link, il browser non risponde fino a quando la chiamata ajax non viene conclusa.
    Le chiamate ajax asincrone di norma non vanno a freezare il browser... le chiamate avvengono in background e l'utente puo continuare a fare ciò che vuole, compreso cambiare pagina, evidentemente c'è qualche altro problema, probabilmente è per questo che non ti risponde nessuno.

  5. #5
    Utente di HTML.it L'avatar di Teuzzo
    Registrato dal
    Mar 2002
    Messaggi
    969
    Ho finalmente scoperto la causa del problema.
    Gli script php chiamati in modo asincrono usavano un sistema di gestione della cache scritto in php. In pratica prima di eseguire lo script pesante si controllava se un file era già presente sul server e non era più vecchio di tot secondi. Se era presente veniva letto, se non era presente veniva eseguito lo script pesante e salvato il file di cache usando le funzione object buffering di php (ob_*).
    Commentando questo script il problema del browser che non risponde più è svanito.
    Quindi in sintesi credo che il problema sia dovuto proprio alle funzione ob_* di php che fino a quando il buffer non viene pulito probabilmente non abortisce lo script.
    Ora devo studiare un sistema diverso per gestire la cache.

  6. #6
    Utente di HTML.it L'avatar di cassano
    Registrato dal
    Aug 2004
    Messaggi
    3,002
    Ma questa variabile xhr dove la hai dichiarata ?

  7. #7
    Utente di HTML.it L'avatar di carlomarx
    Registrato dal
    Oct 2009
    Messaggi
    1,669
    In puro JS il metodo abort() è piuttosto semplice da usare…

    codice:
    <!doctype html>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Documento HTML</title>
    <script type="text/javascript">
    var oAJAXCall = new (function () {
    
        var
    
            bReading = false, oReq = new XMLHttpRequest();
    
        function reqListener () {
            bReading = false;
            alert(this.responseText);
        }
    
        this.abortisci = function () {
            if (!bReading) {
                alert("Non ci sono chiamate in corso da poter abortire!");
                return;
            }
            oReq.abort();
            bReading = false;
            alert("Ho abortito la chiamata AJAX!");
        };
    
        this.leggi = function () {
            if (bReading) {
                alert("C'\u00E8 gi\u00E0 una chiamata in corso!");
                return;
            }
            alert("Sto per leggere lo script pesante\u2026 Premi \"a\" per abortire.");
            bReading = true;
            oReq.open("get", "scriptPesante.php?id1=1&id2=2", true);
            oReq.send();
        };
    
        oReq.onload = reqListener;
    
    })();
    
    /* "r" per iniziare la lettura, "a" per abortirla */
    
    document.onkeypress = function (oPssEvt) {
        var oEvt = oPssEvt || /* IE */ window.event;
        switch (oEvt.charCode) {
            case 114: /* "r" */
                oAJAXCall.leggi();
                break;
            case 97: /* "a" */
                oAJAXCall.abortisci();
                break;
        }
    
    };
    </script>
    </head>
    
    <body>
    
    <p>Premi "r" per leggere lo script pesante, "a" per abortire.</p>
    
    </body>
    </html>
    Tutto ciò che fai con jQuery puoi farlo meglio e con la metà del codice in puro JavaScript.

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.