2015-01-18 14 views
17

थोड़ी देर में, मेरे आवेदन में मेरे अजाक्स कॉल (JQuery 1.8 के माध्यम से) लंबे समय तक (लंबित "स्थिति के साथ" लंबित "स्थिति के साथ अटक जाते हैं। मैं इसे googled है और सभी संभव समाधान काम नहीं किया:क्रोम में JQuery द्वारा लंबित और लंबित AJAX अनुरोध

  1. मेरे पास कोई विज्ञापन अवरोधक स्थापित की है।
  2. मैंने Chrome में "पृष्ठ लोड प्रदर्शन को बेहतर बनाने के लिए नेटवर्क क्रियाओं की भविष्यवाणी" अक्षम कर दी है।
  3. मैंने इसे अद्वितीय बनाने के लिए अजाक्स कॉल में एक क्वेरी स्ट्रिंग भी जोड़ा है (किसी भी क्रोम कैश लॉकिंग को अक्षम करने के लिए)।

क्या आपको कोई हल करने का कोई विचार है? धन्यवाद।

नीचे दिए गए उदाहरण में, अनुरोध 17 मिनट के लिए लंबित था (फिडलर के साथ सत्यापित किया गया था कि इसे केवल 17 मिनट के बाद भेजा गया था)।

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" 

छवि देखें: https://drive.google.com/file/d/0B9uQiZLJG1csNzlPcHZEWHl1Z2c/view

+0

क्या आपके पास मतदान चक्र है? मुझे यह समस्या भी थी, क्योंकि कई अनुरोध थे (50 से 1,5 सेकेंड)। तो, क्रोम तब तक इंतजार कर रहा था जब तक उन्होंने ऐसा नहीं किया, और उसके बाद (26 सेकेंड बाद) ने नवीनतम अनुरोध का इलाज किया, भले ही इसमें केवल 0.1 सेकंड लगे। –

+0

मेरे पास हर 5 मिनट में एक मतदान चक्र है। हालांकि, हम नहीं देखते कि यह क्रोम के 17 मिनट को रोकने का औचित्य कैसे देता है। मतदान अंतराल को कम करने से आपकी समस्या हल हो गई? – Wasafa1

+0

प्रति chrome's explaination, स्थगित समय वह समय है जब अनुरोध भेजा जा सकता है। इस बार प्रॉक्सी वार्ता में बिताए गए किसी भी समय शामिल है। इसके अतिरिक्त, इस बार जब ब्राउज़र पुन: उपयोग के लिए उपलब्ध होने के लिए पहले से स्थापित कनेक्शन की प्रतीक्षा कर रहा है, तो क्रोम के * अधिकतम छह टीसीपी कनेक्शन प्रति मूल नियम * का पालन करेगा। – Sablefoste

उत्तर

3

आप इस कोशिश कर सकते हैं।

अब वास्तविक श्रमजीवी कोड से अपडेट

(मेरे अपने में से कुछ समय क्षेत्र कोड का इस्तेमाल किया ताकि समय क्षेत्र के लिए संदर्भ बहाना)

पहले सरणियों को प्रारंभ करने और चलाने के लिए आपके अनुरोध गिनती तर्क

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

.ajaxStart औरका उपयोग करें सक्रिय अनुरोधों का ट्रैक रखने के लिए।

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

अब आपके अनुरोध हो रही उदाहरण संख्या दी

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

$ .ajax() फ़ंक्शन बनाने के नए अनुरोध

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

निर्माण करने के लिए एक समारोह बनाएं एक XMLHttpRequest ऑब्जेक्ट देता है। इसलिए जब हम अनुरोध करते हैं तो हमारा AJAX वास्तव में भेजा जाता है और अन्य सक्रिय अनुरोधों को बंद कर देता है, तो हम थोड़ी देर के लूप का उपयोग करते हैं।

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

ढेर पर आपके अनुरोध पुश

pendingAjax.push(request[instance]); 

आपके अनुरोध के लिए कॉलबैक बनाएं

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

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

उपयोग जब कॉलबैक लागू करने के लिए

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

कोड को आपके ऐप के लिए थोड़ा बदलाव करने की आवश्यकता हो सकती है, लेकिन उम्मीद है कि आपको यह विचार मिल जाएगा। अगर आपका कोई प्रश्न हैं, तो मुझे से पूछें।

+0

यदि किसी विशेष एंडपॉइंट स्टाल पर कोई अनुरोध होता है तो यह समस्या ठीक करेगा, लेकिन अगर अंतराल के बावजूद सभी अनुरोध रोक दिए जाएंगे तो क्या होगा? मेरे मामले में क्रोम केवल इस स्थिति में जाने पर प्रति सेकंड एक बार अनुरोध शुरू करता है (शायद क्रोम अनुरोधों को थ्रॉटल कर रहा है क्योंकि एप्लिकेशन एक समय में बहुत अधिक भेज रहा है, क्रोम क्या सोचता है सीमित करने के लिए एक बुरी तरह से व्यवहार करने वाला ऐप है)? – kashiraja

6

मैंने बिल्कुल वही समस्या पर ठोकर खाई है। जैसे ही मैंने अक्षम: -> गोपनीयता -

और अधिक तेजी से पृष्ठों को लोड करने

जाओ उन्नत सेटिंग्स पूर्वानुमान सेवा का उपयोग> सीए तीसरा चेकबॉक्स, सबकुछ काम करना शुरू कर दिया जैसा कि इसे करना चाहिए। मैं त्रुटि को पुन: उत्पन्न करने में असमर्थ था।

jquery/ajax परारक फ़ायरफ़ॉक्स में पूरी तरह से काम करता है। यह केवल क्रोम - लिनक्स & विंडोज़ पर परीक्षण किया गया है।

यह एक सही समाधान नहीं है, क्योंकि यह वैश्विक अर्थों में उपयोगकर्ताओं को प्रभावित नहीं करेगा - लेकिन शायद आप एक ही स्थिति में हैं जैसे सीमित दर्शक।

+0

यह मेरे लिए भी समस्या को ठीक करने लगता है। – kristinalim

+0

इससे मेरे मामले में कोई फर्क नहीं पड़ता, लेकिन दिलचस्प परिकल्पना। बस क्रोम को प्रत्येक टैब/सत्र के लिए बकाया अनुरोधों की संख्या 6 तक सीमित करें, इसलिए पृष्ठभूमि में अन्य चीजें चल रही हैं जो क्रोम के भीतर देव उपकरणों में नेटवर्क मॉनिटर में दिखाई नहीं दे रही हैं। – kashiraja

संबंधित मुद्दे