Доступ к переменной, значение которой установлено в функции AJAX - PullRequest
0 голосов
/ 19 ноября 2010

У меня проблема. Я пытался решить проблему того, как избежать использования глобальных переменных. Вместо этого я решил использовать объект с функциями и написал соответствующий скрипт. Однако сценарий не будет работать должным образом:

GetXML: function() {
        $.ajax({
            type: "GET",
            url: "questions.xml",
            dataType: "xml",
            success: function(xml) {
                this.xml=xml;
                $(window).trigger("canUseXML");
                var docLength = $(xml).find('Question').length + 1;
                alert("this really is an '" + this.xml + "' and the actual doclength is: " + docLength)//This is the first alert I mention.         
            } //close success           
        });//close AJAX     

        alert("yes! this is still a: " +this.xml) //This is the second alert I mention.
    },

Если все это работает так, как ожидалось, оба предупреждения приведут к «объекту XMLDocument» (переменная, объявленная в другом месте этой строки: this.xml = null;). Первый работает, как и ожидалось. Однако второе, вне этой функции, возвращает значение «ноль». Почему?

Спасибо, Эллиот Бонневиль

P.S. Я застрял на казалось бы простом вопросе о передаче переменных между функциями в течение недели.

Ответы [ 4 ]

2 голосов
/ 19 ноября 2010

В JavaScript «this» всегда относится к «владельцу» выполняемой функции или, скорее, к объекту, для которого функция является методом.Таким образом, ваше первое и второе «this» не относятся к одному и тому же.

Предполагается, что функция «success» выполняется перед вторым предупреждением (чего, вероятно, нет).Вы можете сделать что-то вроде этого:

GetXML: function() {
 var that=this;
.
.

и затем использовать «тот» вместо «этот».

1 голос
/ 19 ноября 2010

У вас есть две проблемы:

  1. Scoping: this внутри обратного вызова не является вашим объектом с GetXML в качестве члена. Используйте что-то вроде me = this; в конструкторе вашего объекта, а затем используйте me вместо this, чтобы явно установить значение.

  2. Ваша функция обратного вызова ожидает успешного выполнения вашего Ajax-запроса, но остальная часть сценария продолжается, что и является целью обратных вызовов. Итак, запрос Ajax сделан, и затем вы делаете alert("yes! this is still a: " +this.xml), пока обратный вызов еще не был выполнен.

1 голос
/ 19 ноября 2010

Scoping. Когда вы выходите за пределы анонимной функции (xml), this.xml больше не существует.

0 голосов
/ 19 ноября 2010

Это, вероятно, происходит потому, что для обработки ajax требуется время.Javascript не ждет одного запроса перед выполнением следующей команды, поэтому во время вызова AJAX он пытается выяснить, что случилось с this.xml.

...