سؤال

لقد كنت أعمل على أداة Windows (بمعنى أن "المتصفح" هو Internet Explorer) الذي يحدد الاستعلامات عناوين الشبكة الفرعية للمعلومات. الآن ، يفعل هذا في بعض الأحيان بوتيرة سريعة نسبيًا (تقريبًا كل 5 ثوانٍ) ويعمل بشكل جيد بما فيه الكفاية. ومع ذلك ، في بعض الأحيان سوف تتعثر في Ready State 1 وسيبقى هناك إلى الأبد. عندما تحاول الأداة إعادة تشغيل وظيفة الحصول على XMLHTTPrequest والحصول على المعلومات منها ، فإنها ستبقى في الحالة 1. يمكن تكرارها بسهولة عند فتح مثيلات متعددة من الأداة ثم إغلاق جميعها باستثناء واحدة منها. في هذه المرحلة ، فإن الشخص الذي لا يزال مفتوحًا سيتوقف دائمًا في هذه الحالة. أشعر أن الأمر قد يكون له علاقة معهم جميعًا للوصول إلى نفس الموقع ، أو قد يكون له علاقة مع XMLHTTPrequests التي يتم إيقافها في منتصف النقل والتي تمنع أخرى من العمل. فيما يلي الرمز ذي الصلة.

//Reference to this for the inner function
var me = this;
var request = new XMLHttpRequest();
request.onreadystatechange = onReadyStateChange;
var url = this.url;
//Make the URL random to prevent being cached
url += ("&a=" + ((new Date()).getTime()));
Trace(DEBUG_COMM, "Sase.updateStatus url: " + url);
request.open("GET", url, true);
request.send();   // fire off the request, calls httpRequestReadyStateChange as things continue
Trace(DEBUG_COMM, "Request sent" + request.readyState); 
function onReadyStateChange() {Trace(DEBUG_COMM, "Sase.httpRequestReadyStateChange: state=" + request.readyState);
    if (4 == request.readyState) {
        Trace(DEBUG_COMM, "Sase.httpRequestReadyStateChange: status=" + request.status);

        if (request.status == 200) {
            Trace(DEBUG_COMM, "retrieved html: " + request.responseText);
            var results = request.responseText;
            var resultsString = request.responseText.toString();
            Trace(DEBUG_COMM, "results String: " + resultsString);
            me.ParseStatusData(resultsString);
        }
        else {
            //me.commError(request.status);
        }

        request = null;
    }
}
هل كانت مفيدة؟

المحلول

حسنًا ، يبدو أنني اكتشفت ذلك. كان لدي شعور بأنه كان طلبًا لم يتم حله ، لأنه يحدث فقط عند إغلاق مثيلات منه (يعني أنه إذا كان أحدها مغلقًا أثناء الاتصال بالخادم ، فإنه يبقى في الاتصال إلى الأبد ولا يمكن لأي شخص آخر الوصول إلى الخادم) و يبدو أن هذا هو الحال. لقد قمت ببعض التعديلات على الكود في مناطق متعددة وبشكل أساسي ما يتعلق به هو عندما تغلق الأداة ، فإنها تتأكد من إحباط جميع الطلبات. الطلبات هي الآن متغيرات مثيل (للسماح بإجهاضها) ، ولكن لا تزال جديدة في كل مرة تكون هناك حاجة إليها.

نصائح أخرى

بالنسبة لأولئك الذين يتعثرون عبر هذا ويحتاجون إلى مثال رمز ملموس ، هنا تذهب.

واجهت نفس المشكلة وكان الحل هو إعادة استخدام كائن XMLHTTPrequest ، لضمان إلغاء أي طلب سابق قبل بدء طلب جديد. لن ينجح هذا إذا كنت ترغب في الحصول على طلبات متعددة من Ajax تتجول ولكن في حالتي التي تسبب طلبًا جديدًا يعني أن آخر طلب لم يعد مطلوبًا.

مرت جميع الطلبات الموجودة على صفحتي بنفس طريقة Wrapper XMLHTTPrequest والتي بدت هكذا ؛

//Declare the XMLHttpRequest object to be re-used
var global_xHttpRequest = null;

function xmlHttpHandler(type, params, complete, postData) {

   //Prevents an issue where previous requests get stuck and new ones then fail
   if (global_xHttpRequest == null) {
       global_xHttpRequest = new XMLHttpRequest();
   } else {
       global_xHttpRequest.abort();
   }

   //Parse out current URL
   var baseURL = window.location.host;
   var svc = "https://" + baseURL + "/processAction?";

   var url = svc + params;

   global_xHttpRequest.open(type, url, true);

   //Add the callback
   global_xHttpRequest.onreadystatechange = complete;

   global_xHttpRequest.send(postData);
}

التي يمكن استخدامها مثل هذا:

   xmlHttpHandler("GET", params, completeFnc);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top