Проблема класса Javascript AJAX - PullRequest
       2

Проблема класса Javascript AJAX

0 голосов
/ 14 августа 2011

Привет Я не уверен, как именно описать эту проблему, поэтому я надеюсь, что код объяснит мою проблему.Сценарий php (phppage.php), вызываемый функцией ajax, не делает ничего, кроме echo hello world.

Когда строка предупреждения ('a') оставлена ​​в функции отзыва с помощью функции ajax, тогда кодработает как положено, а в последней строке выскакивает сообщение "привет мир".Однако затем строка предупреждения ('a') закомментирована, затем последняя строка не дает "привет мир", но значение 13, как установлено в функции конструктора.

Я пытаюсь этона firefox 3.6.18

Любая помощь будет с благодарностью.

function A() {
    this.b = 13;
    function finish(context,response) {
        context.b = response;
    }
    ajax(finish,this);
}

A.prototype = {
    constructor: A
}

function ajax(callback,context) {
    var http = new XMLHttpRequest();
    var url = "phppage.php";
    http.open("GET", url, true);
    http.onreadystatechange = recall;
    function recall() {
        alert('a');
        if(http.readyState == 4 && http.status == 200) {
            callback(context,http.responseText);
        }
    }
    http.send(null);
}

var d = new A();
alert(d.b);

1 Ответ

1 голос
/ 14 августа 2011

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

function A() {
    this.b = 13;
    //this is how you should be storing contexts
    var that = this;
    function finish(response) {
        that.b = response;
    }
    ajax(finish);
}

finish будет иметь доступ к этому даже после того, как конструктор A вернется.Кроме того, вам не нужен тот материал-прототип, который есть у вас под А.Он буквально ничего не делает.

Наконец, мы можем немного привести в порядок вашу AJAX-функцию, чтобы она выглядела так:

function ajax(callback) {
    var http = new XMLHttpRequest();
    var url = "phppage.php";
    http.open("GET", url, true);
    http.onreadystatechange = function() {
        alert('a');
        if(http.readyState == 4 && http.status == 200) {
            callback(http.responseText);
        }
    }
    http.send(null);
}

Обратите внимание, что это весь непроверенный код, поэтому нет никаких гарантий, что он будет работатьно я думаю, что это укажет вам правильное направление.

РЕДАКТИРОВАТЬ:

Теперь, когда я смотрю на ваш код, я понимаю, что он, вероятно, работает просто потому, что вы вызываете ajax асинхронно, так чтосразу возвращается, и вы выводите значение b, прежде чем получить его обратно.

может захотеть попробовать:

http.open("GET", url, false);

(но все мои комментарии выше все равно следует учитывать, поскольку онибудет действительно убирать вещи немного)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...