2015-01-18 19 views
17

Đôi khi, các cuộc gọi Ajax của tôi (qua JQuery 1.8) trong ứng dụng của tôi bị kẹt với trạng thái "đang chờ xử lý" trong một thời gian dài (đôi khi lên đến 17 phút). Tôi đã googled nó và tất cả các giải pháp có thể không hoạt động:Yêu cầu ajax bị trì hoãn và chờ xử lý bởi JQuery trong Chrome

  1. Tôi chưa cài đặt trình chặn quảng cáo.
  2. Tôi đã vô hiệu hóa cờ "hành động mạng dự đoán để cải thiện hiệu suất tải trang" trong Chrome.
  3. Tôi cũng đã thêm một chuỗi truy vấn vào cuộc gọi Ajax để làm cho nó trở thành duy nhất (để tắt mọi khóa bộ nhớ cache của Chrome).

Bạn có biết cách giải quyết vấn đề này không? Cảm ơn.

Trong ví dụ bên dưới, yêu cầu đang chờ trong 17 phút (được xác minh bằng Fiddler rằng nó chỉ được gửi sau 17 phút).

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" 

Xem hình ảnh: https://drive.google.com/file/d/0B9uQiZLJG1csNzlPcHZEWHl1Z2c/view

+0

Bạn có chu kỳ bỏ phiếu không? Tôi đã có vấn đề này quá, bởi vì đã có nhiều yêu cầu (50 cho 1,5 giây). Vì vậy, chrome đã được chờ đợi cho đến khi họ thực hiện, và chỉ sau đó (26 giây sau đó) điều trị yêu cầu mới nhất, mặc dù nó chỉ mất 0,1 giây. –

+0

Tôi có chu kỳ bỏ phiếu cứ sau 5 phút. Tuy nhiên, chúng tôi không thấy nó biện minh cho việc trì hoãn 17 phút của Chrome. đã giảm khoảng thời gian bỏ phiếu đã giải quyết được vấn đề của bạn chưa? – Wasafa1

+0

Mỗi chrome's explaination, Thời gian ngừng hoạt động là thời gian yêu cầu đã chờ trước khi có thể gửi. Thời gian này bao gồm mọi thời gian dành cho đàm phán proxy. Ngoài ra, thời gian này sẽ bao gồm khi trình duyệt đang chờ kết nối đã được thiết lập để có thể sử dụng lại, tuân thủ * tối đa sáu kết nối TCP cho mỗi quy tắc xuất xứ *. – Sablefoste

Trả lời

3

Bạn có thể thử này.

VỚI DOANH NGHIỆP ĐÃ CẬP NHẬT VỚI CÔNG TÁC THỰC TẾ MÃ

(sử dụng một số mã múi giờ của riêng tôi rất xin lỗi các tham chiếu đến múi giờ)

Đầu tiên khởi tạo mảng và chạy theo yêu cầu đếm logic của bạn

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

Sử dụng .ajaxStart và 012.để theo dõi các yêu cầu hoạt động.

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

Tạo một chức năng để xây dựng các yêu cầu mới

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

Bây giờ tạo yêu cầu của bạn nhận được số ví dụ trở

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

The() chức năng $ .ajax trả về một đối tượng XMLHttpRequest. Vì vậy, chúng tôi sử dụng một vòng lặp while để kiểm tra khi ajax của chúng tôi thực sự được gửi và hủy bỏ các yêu cầu hoạt động khác nếu yêu cầu bị ngừng.

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

Đẩy yêu cầu của bạn vào stack

pendingAjax.push(request[instance]); 

Tạo callbacks cho yêu cầu của bạn

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

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

sử dụng khi áp dụng callbacks

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

Mã có thể cần một chút chỉnh sửa cho ứng dụng của bạn, nhưng hy vọng bạn sẽ có được ý tưởng. Hãy cho tôi biết nếu bạn có bất kỳ câu hỏi.

+0

Điều này sẽ khắc phục sự cố nếu yêu cầu trên một điểm cuối điểm cuối cụ thể, nhưng điều gì sẽ xảy ra nếu tất cả các yêu cầu bị ngừng hoạt động, bất kể điểm cuối? Trong trường hợp của tôi, Chrome chỉ gửi yêu cầu một lần mỗi giây khi nó đi vào trạng thái này (có thể Chrome đang điều chỉnh các yêu cầu vì ứng dụng gửi quá nhiều lần, để hạn chế những gì Chrome nghĩ là ứng dụng hoạt động kém)? – kashiraja

6

Tôi đã vấp phải chính xác cùng một vấn đề. Ngay sau khi tôi bị vô hiệu hóa:

Sử dụng dịch vụ dự đoán để tải trang nhanh hơn

Go Advanced Settings -> Privacy -> ca. Hộp kiểm thứ 3, mọi thứ bắt đầu hoạt động như mong muốn. Tôi không thể tạo lại lỗi.

Poller jquery/ajax hoạt động hoàn hảo trong Firefox. Chỉ có Chrome - được thử nghiệm trên Linux & Windows.

Nó không phải là một giải pháp hoàn hảo, vì nó sẽ không ảnh hưởng đến người dùng theo nghĩa toàn cầu - nhưng có thể bạn đang ở trong tình trạng tương tự như tôi - giới hạn khán giả.

+0

Điều này dường như cũng khắc phục được sự cố cho tôi. – kristinalim

+0

Điều này không tạo ra bất kỳ sự khác biệt nào trong trường hợp của tôi, nhưng là giả thuyết thú vị. Chỉ cần đặt Chrome giới hạn số lượng yêu cầu chưa xử lý cho mỗi tab/phiên thành 6 vì vậy có thể có những thứ khác đang diễn ra trong nền không hiển thị trong màn hình mạng trong các công cụ tìm kiếm trong Chrome. – kashiraja

Các vấn đề liên quan