Почему моя AJAX-функция вызывает обратный вызов несколько раз?

Мы создали функцию поста ajax, и когда я вызываю ее один раз, функция обратного вызова, которая передается ей, в итоге вызывается 3 раза.Почему обратный вызов вызывается несколько раз?

Я пытаюсь использовать "модуль» шаблон javascript, который использует замыкания, чтобы обернуть аналогичные функции в одну глобальную переменную Мой AJAX-модуль является его собственным файлом и выглядит так:

var ajax = (function (XMLHttpRequest) {
    "use strict";

    var done = 4, ok = 200;

    function post(url, parameters, callback) {

        var XHR = new XMLHttpRequest();

        if (parameters === false || parameters === null || parameters === undefined) {
            parameters = "";
        }

        XHR.open("post", url, true);
        XHR.setRequestHeader("content-type", "application/x-www-form-urlencoded");
        XHR.onreadystatechange = function () {
            if (XHR.readyState === done && XHR.status === ok) {
                callback(XHR.responseText);
            }
        };
        XHR.send(parameters);
    }

    // Return the function/variable names available outside of the module.
    // Right now, all I have is the ajax post function.
    return {
        post: post
    };

}(parent.XMLHttpRequest));

Основное приложение также это "собственный файл. Это, как пример, выглядит так:

// Start point for program execution.

(function (window, document, ajax) {
    "use strict";

    ajax.post("php/paths.php", null, function () { window.alert("1"); });

}(this, this.document, parent.ajax));

Как видите, яЯ пытаюсь ввести зависимости как локальные переменные / пространства имен. Когда он запускается, он выскакивает окно с предупреждением 3 раза.

Я не уверен, является ли эта проблема из-за самой функции AJAX или общей архитектуры (или обоих), поэтому яБуду признателен за комментарии или мысли либо.

мы пытались распаковать основную часть программы от анонимной функции, но это неТ помочь. Заранее спасибо!

РЕДАКТИРОВАТЬ: Вот'весь HTML-файл, так что вы можете увидеть порядок, в который я включаюв дюймах




    
    
    Mapalicious
    
    


    
    
    
    
    


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

У меня была опечатка в моем примере, и изменил

(function (window, document, bigmap, ajax) {

в

(function (window, document, ajax) {

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

мы изменилиonreadystatechange Функция для регистрации состояния готовности на консоли:

XHR.onreadystatechange = function () {
    console.log("readyState: " + XHR.readyState);
    if (XHR.readyState === done && XHR.status === ok) {
        callback(XHR.responseText);
    }
};

Когда я перебираю код в Google Chrome, обратный вызов вызывается три раза, и консоль записывает в журнал:

readyState: 4
readyState: 4
readyState: 4

Тем не менее, когда я запускаю страницу как обычно и неПосле этого функция работает, как и ожидалось, и выполняет обратный вызов только один раз. В этом случае консоль регистрирует:

readyState: 2
readyState: 3
readyState: 3
readyState: 4

Итак, теперь мой вопрос,почему обратный вызов вызывается несколько раз при переходе по коду?

РЕШИТЬ:

Когда я задал этот вопрос, я нене понимаю, чтоэто происходило только когда я шел по коду во время отладки.

Таксостояние менялось 3 раза, но выполнение было отложено до точки останова, поэтому все 3onreadystatechange функции видят текущее состояние 4, а не какое состояниебыло когда изменение действительно произошло.

Вывод в том, чтоonreadystatechange изменение не хранит, что это за состояние. Вместо этого он читаетreadyState во время его исполнения, даже если программа прерывается, и в это же время состояние снова меняется.

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

Спасибо всем, кто помогал здесь.

Ответы на вопрос(3)

Ваш ответ на вопрос