2015-01-18 12 views
17

Una volta ogni tanto, le mie chiamate Ajax (tramite JQuery 1.8) nella mia applicazione sono bloccate con lo stato "in attesa" per un lungo periodo (a volte fino a 17 minuti). L'ho cercato su google e tutte le possibili soluzioni non hanno funzionato:Richieste Ajax bloccate e in sospeso da JQuery in Chrome

  1. Non ho installato nessun blocco annunci.
  2. Ho disattivato il flag "Prevedi azioni di rete per migliorare le prestazioni di caricamento della pagina" in Chrome.
  3. Ho anche aggiunto una stringa di query alla chiamata Ajax per renderla univoca (per disabilitare qualsiasi blocco della cache di Chrome).

Avete qualche idea su come risolvere questo? Grazie.

Nell'esempio seguente, la richiesta era in sospeso per 17 minuti (verificato con Fiddler che è stato inviato solo dopo 17 minuti).

GET http://www.mywebsite.com/foo/rest/publishers/1/packages?_=1421584749323 HTTP/1.1 
    Host: www.mywebsite.com 
    Connection: keep-alive 
    Accept: application/json, text/javascript, */*; q=0.01 
    X-Requested-With: XMLHttpRequest 
    User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.99 Safari/537.36 
    Content-Type: application/json 
    Referer: http://www.mywebsite.com/foo/client/home 
    Accept-Encoding: gzip, deflate, sdch 
    Accept-Language: en-US,en;q=0.8,he;q=0.6,ru;q=0.4 
    Cookie: JSESSIONID=C668509B5AFCDEBE9C9774C4721AFB9D; 
    aaassz="ddss" 

Vedi Immagine: https://drive.google.com/file/d/0B9uQiZLJG1csNzlPcHZEWHl1Z2c/view

+0

Avete un ciclo di polling? Ho avuto anche questo problema, perché c'erano molte richieste (50 per 1,5 secondi). Quindi, Chrome stava aspettando fino a quando non l'hanno fatto, e solo dopo (26 secondi dopo) ha trattato l'ultima richiesta, anche se ci vuole solo 0,1 secondi. –

+0

Ho un ciclo di polling ogni 5 minuti. Tuttavia, non vediamo come giustifichi lo stallo di Chrome di 17 minuti. la riduzione dell'intervallo di polling ha risolto il tuo problema? – Wasafa1

+0

Per chrome's explaination, Il tempo di stallo è il tempo in cui la richiesta è stata spesa in attesa prima che potesse essere inviata. Questo tempo è comprensivo di qualsiasi tempo trascorso nella negoziazione del proxy. Inoltre, questa volta includerà quando il browser è in attesa che una connessione già stabilita diventi disponibile per il riutilizzo, rispettando la massima sei connessioni TCP di Chrome * per regola di origine *. – Sablefoste

risposta

3

si può provare questo.

SOCIETÀ AGGIORNATO CON CODICE REALE DI LAVORO

(usato un codice fuso orario del mio modo scusare i riferimenti alle fuso orario)

inizializzo prima array ed eseguire la logica di conteggio richiesta

var request = (typeof request != 'undefined' && request instanceof Array) ? request : []; 
var pendingAjax = (typeof pendingAjax != 'undefined' && pendingAjax instanceof Array) ? pendingAjax : []; 

Utilizzare .ajaxStart e .ajaxStop per tenere traccia delle richieste attive.

var ajaxActive = 0; 
$(document).ajaxStart(function() { 
    ajaxActive++; 
    document.ajaxQueueFull = ajaxActive > 5; 
}); 
$(document).ajaxStop(function() { 
    ajaxActive--; 
    document.ajaxQueueFull = ajaxActive > 5; 
} 

Creare una funzione per costruire nuove richieste

function ajaxRequestNew(t, u, d, s) { 

     var instance = request.length + 1; 
     request[instance] = $.ajax({ 
      method: t, 
      url: u, 
      data: {ajaxPost: d }, 
      success: s 
     }); 
     return instance; 
    } 

Ora crea la richiesta di ottenere il numero di istanza restituito

var instance = ajaxRequestNew('POST', 
            'js/ajax_timezone.php', 
            { ajaxAction : "ajaxGetTimezone", 
            tzoffset : "0", 
            tztimezone: "America/New_York" }, 
            function(data) { } 
    ); 

La funzione $ .ajax() restituisce un oggetto XMLHttpRequest. Quindi usiamo un ciclo while per controllare quando il nostro ajax viene effettivamente inviato e interrompe altre richieste attive se la richiesta è in stallo.

while(request[instance] === null || (request[instance].readyState < 1 || request[instance].readyState > 4)) { 
     if (document.ajaxQueueFull) { 
      //abort existing requests 
      $.each(request, function(i,v) { 
       if (i !== instance) { 
        request[i].abort(); 
       } 
      }); 
     } 
    } 

spingere la vostra richiesta nello stack

pendingAjax.push(request[instance]); 

Crea callback per la vostra richiesta

var timezoneFailCallback = function(data) { 
     console.log('fail'); 
     console.dir(data); 
    }; 

    var timezoneSuccessCallback = function(data) { 
     console.log('success'); 
     console.dir(data); 
    }; 

uso quando applicare i callback

$.when.apply($, pendingAjax).done(timezoneSuccessCallback).fail(timezoneFailCallback); 

Il codice potrebbe richiedere un piccolo ritocco per la tua app, ma si spera che tu abbia l'idea. Fatemi sapere se avete domande.

+0

Questo risolverebbe il problema se una richiesta su un particolare endpoint dovesse bloccarsi, ma cosa succederebbe se tutte le richieste fossero bloccate, indipendentemente dall'endpoint? Nel mio caso, Chrome avvia una richiesta una volta al secondo solo quando entra in questo stato (forse Chrome sta riducendo le richieste perché l'applicazione ne sta inviando troppe alla volta, una sorta di limitazione a ciò che Chrome ritiene sia un'app malamente funzionante)? – kashiraja

6

Mi sono imbattuto esattamente nello stesso problema. Non appena ho disabilitato:

utilizzare un servizio di previsione per caricare le pagine più velocemente

Go Impostazioni avanzate -> Privacy -> ca. Terza casella di controllo, tutto ha iniziato a funzionare come dovrebbe. Non ero in grado di riprodurre l'errore.

Il polling jquery/ajax funziona perfettamente in Firefox. È solo Chrome - testato su Linux & Windows.

Non è una soluzione perfetta, in quanto non influenzerà gli utenti in senso globale - ma forse ci si trova nella stessa situazione di I - pubblico limitato.

+0

Questo sembra risolvere il problema anche per me. – kristinalim

+0

Questo non ha fatto alcuna differenza nel mio caso, ma ipotesi interessante. In poche parole, Chrome limita il numero di richieste in sospeso per ogni scheda/sessione a 6, quindi forse ci sono altre cose sullo sfondo che non vengono visualizzate nel monitor di rete negli strumenti di sviluppo di Chrome. – kashiraja

Problemi correlati