تحميل AJAX بالتزامن مع Getters و Setters
-
26-09-2019 - |
سؤال
لقد كنت أعمل مع Getters و Petters لتجنب احتمال استخدام المتغيرات العالمية. ومع ذلك ، لقد واجهت مشكلة. الرمز أدناه ، الذي يعمل بشكل جيد مع متغيرات عدد صحيح ، يلقي استثناء عندما أحاول تشغيل مكالمة AJAX بدلاً من ذلك. هل يمكن لأحد أن يشرح لي لماذا يحدث هذا؟
function Object_XML() {
me = this;
me.xml = null;
}
Object_XML.prototype = {
getXML: function() {
return me.xml
},
setXML: function(data) {
me.xml = data;
},
loadXML: function() {
$.ajax({
type: "GET",
url: "questions.xml",
dataType: "xml",
success: function(xml) {
me.setXML(xml);
} //close success
});//close AJAX
}//close setXML
};
$(document).ready(function() {
var data = new Object_XML();
alert("This is an " + data.getXML());
data.setXML();
alert("This is an " + data.getXML());
});
شكرا ، إليوت بونفيل
المحلول
لقد ألغت فقط استخدامك للمتغيرات الخاصة مع getters والمستقبين باستخدام me = this;
لقد صنعت للتو me
متغير عالمي من خلال عدم الاستخدام var
. (أي متغير لم يتم تعريفه باستخدام VAR يتم توصيله بمساحة الاسم العالمية)
في حالتك نظرًا لأنك تعمل ضمن نطاق الكائن نفسه ، يمكنك استخدامك فقط this
وتجنب me
شخصيًا ، أعتقد أنه أمر محير. ولكن إذا كنت تريد التمسك بهذا النموذج ، فاستخدم var me = this;
مثالك غير واضح حقًا ، أين يحدث الخطأ؟ أنت تتصل data.setXml()
مع عدم وجود معلمات ، لذلك me.xml
سوف يراهن على undefined
. هذا أمر متوقع إذا لم تقم بأي شيء إلى هذه الطريقة.
ضع في اعتبارك أيضًا أنه بسبب الطبيعة غير المتزامنة لمكالمتك ، إذا كنت ستفعل شيئًا مثل:
data.loadXml();
console.log("data.getXML();", data.getXML()); // would be undefined
data.getxml () في تلك اللحظة ستظل غير محددة لأنه من المحتمل أن لا تعود مكالمتك غير المتزامنة بعد ، وبالتالي عدم تعيين سمة XML لكائنك.