2015-01-18 17 views
17

Co jakiś czas moje wywołania Ajax (przez JQuery 1.8) w mojej aplikacji są zablokowane ze stanem "oczekujący" przez długi czas (czasami do 17 minut). Mam googleed i wszystkie możliwe rozwiązania nie działają:Zatrzymane i oczekujące wnioski ajax JQuery w Chrome

  1. Nie mam zainstalowanego programu do blokowania reklam.
  2. Wyłączyłem opcję "przewiduj działania w sieci w celu zwiększenia skuteczności wczytywania strony" w Chrome.
  3. Dodałem również ciąg zapytania do wywołania Ajax, aby był unikalny (aby wyłączyć blokowanie pamięci podręcznej Chrome).

Czy masz pojęcie, jak rozwiązać ten problem? Dzięki.

W poniższym przykładzie żądanie było w toku przez 17 minut (zweryfikowane przez Fiddlera, że ​​zostało wysłane dopiero po 17 minutach).

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" 

Zobacz obraz: https://drive.google.com/file/d/0B9uQiZLJG1csNzlPcHZEWHl1Z2c/view

+0

Czy masz cykl odpytywania? Miałem też ten problem, ponieważ było wiele próśb (50 przez 1,5 sek.). Tak więc, chrome czekało, aż to zrobi, i dopiero po tym (26 sekund później) potraktował ostatnie żądanie, mimo że trwa tylko 0,1 sekundy. –

+0

Mam cykl odpytywania co 5 minut. Nie widzimy jednak, jak uzasadnia to 17-minutowe opóźnianie Chrome. czy skrócenie przerwy w odpytywaniu rozwiązało twój problem? – Wasafa1

+0

Per chrome's explaination, Czas wstrzymania to czas oczekiwania oczekiwania na wysłanie. Ten czas obejmuje cały czas spędzony na negocjowaniu proxy. Co więcej, czas ten będzie obejmował przeglądarkę, która czeka, aż nawiązane połączenie stanie się dostępne do ponownego użycia, przestrzegając maksymalnie sześciu zasad połączenia Chrome * na regułę pochodzenia *. – Sablefoste

Odpowiedz

3

Można spróbować.

zaktualizowane o rzeczywisty kod PRACY

(używany jakiś kod strefy czasowej na własną rękę więc przepraszam odniesień do strefy czasowej)

zainicjalizuję tablice i uruchomić żądanie logika liczenie

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

Użyj .ajaxStart i .ajaxStop, aby śledzić aktywne żądania.

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

Tworzenie funkcji do budowania nowych żądań

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; 
    } 

teraz stworzyć swój wniosek dostaniem liczba instancji powrócił

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

$ .ajax function() zwraca obiekt XMLHttpRequest. Więc używamy pętli while, aby sprawdzić, kiedy nasz ajax faktycznie zostanie wysłany i przerywa inne aktywne żądania, jeśli żądanie jest zablokowane.

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(); 
       } 
      }); 
     } 
    } 

Push wniosek na stosie

pendingAjax.push(request[instance]); 

Tworzenie wywołania zwrotne na żądanie

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

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

wykorzystanie kiedy stosować zwrotnych

Kod może wymagać drobnych zmian w aplikacji, ale mam nadzieję, że wpadniesz na ten pomysł. Daj mi znać, jeśli masz jakieś pytania.

+0

Naprawiłoby to problem, jeśli żądanie na konkretnym punkcie końcowym przestanie działać, ale co będzie, jeśli wszystkie żądania zostaną zatrzymane, bez względu na punkt końcowy? W moim przypadku Chrome inicjuje żądanie tylko raz na sekundę, gdy przechodzi w ten stan (może Chrome ogranicza liczbę żądań, ponieważ aplikacja przesyła zbyt wiele naraz, by ograniczyć to, co Chrome uważa za niewłaściwie zachowującą się aplikację)? – kashiraja

6

Natknąłem się na dokładnie ten sam problem. Jak tylko wyłączone:

Użyj podpowiedzi, aby szybciej ładować strony

Go Ustawienia zaawansowane -> Prywatność -> ca. Trzecie pole wyboru:, wszystko zaczęło działać tak, jak powinno. Nie udało mi się odtworzyć błędu.

Poller jquery/ajax działa doskonale w przeglądarce Firefox. To tylko Chrome - testowany na systemie Linux & Windows.

Nie jest to idealne rozwiązanie, ponieważ nie wpłynie to na użytkowników w sensie globalnym - ale może jesteś w takiej samej sytuacji, jak ja - ograniczona liczba odbiorców.

+0

To wydaje się naprawić problem również dla mnie. – kristinalim

+0

To nie miało żadnego znaczenia w moim przypadku, ale interesująca hipoteza. Po prostu Chrome ogranicza liczbę zaległych żądań dla każdej karty/sesji do 6, więc być może inne rzeczy dzieją się w tle, które nie pojawiają się na monitorze sieci w narzędziach programistycznych w Chrome. – kashiraja

Powiązane problemy