(js) отладка Firebug, заставляющая работать код - PullRequest
0 голосов
/ 20 апреля 2011

Пожалуйста, извините за неуклюжее название, я постараюсь изо всех сил объяснить мою странную проблему.

У меня есть три бита кода JavaScript:

  • Некоторый самоисполняющийся код, который вызывает мою личную функцию Ajax и передает ей обратный вызов.
  • Сама функция ajax, которая извлекает данные, вызывает функцию обратного вызова, передавая ей данные.
  • Сам обратный вызов, который принимает данные и анализирует их в массив длиной n .

Что следует отметить, так это то, что сам исполняемый код и функция обратного вызова определены в их собственном замыкании. Доступ к функции ajax осуществляется через импортированное именованное замыкание, которое я определил как $ .

Я довольно новичок в JavaScript и все еще изучаю замыкания и их области применения. У меня есть основания полагать, что эта проблема, вероятно, связана с этим.

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

Это самоистребовавшееся:

(function ($){

    //Load stock
var items = [];
var response = $.Ajax("scripts/Lookup.php","GET",parse);

function parse(a){
    for(/*Simplified view*/){
        var item = new $.Item();
        item.name = domStuff.textContent;
        item.description = domStuff.textContent;
        item.price = domStuff.textContent;
        item.id = domStuff.textContent;

        items.push(item);
    }
}

    //Test the length (and verify contents)
    for(var i=0; i < items.length; i++){
        alert(items[i].price);
    }
}($));

Это мои определения, которые включают в себя функцию Ajax:

var $ = (function(){
var s = {};

    var ajax = function(url,method,callback){
        var a = new XMLHttpRequest();
        a.open(method, url, true);
        a.onreadystatechange = function(){
        if(this.readyState==4){
                callback(a);
            }
    }
    a.send();
    };

    s.Ajax = (function(){
        return ajax;
    }());

return s;
}());

Итак, что оправдывает заголовок, так это то, что когда я проверяю код с помощью firebug, я вижу, что items заполнен 3 объектами, правильно определенными проанализированными данными.

Затем цикл предупреждает 3 раза.

Однако, если я удаляю точки останова, а firebug игнорирует код, цикл не воспроизводится, и я могу только предполагать, что массив пуст.

Код работает также, если я предупреждаю (элементы) до цикла проверки.

Ответы [ 3 ]

2 голосов
/ 20 апреля 2011

AJAX заполняет элементы асинхронно , что означает в вашем закрытии первые элементы исполнения. Длина будет равна нулю (из исходной инициализации массива). Со временем AJAX через вызовы вашего parse метода заполнит этот массив.

Поскольку вы держите items в закрытом состоянии, вы на самом деле не сможете получить к нему доступ извне - это хорошая практика, но может вызвать проблемы с отладкой! Вместо items.push(item) попробуйте alert(item) (любой браузер, но блокировка выполнения) или console.log(item) (только firebug), чтобы убедиться, что вы действительно получаете результаты обратно из AJAX, а не при первоначальном выполнении.

1 голос
/ 20 апреля 2011

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

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

1 голос
/ 20 апреля 2011

Я ни в коем случае не эксперт по JavaScript. Однако на других языках программирования я сталкивался с ситуациями, когда отладка решала проблему.

В этих случаях отладка настолько замедляла код, что он работал. Некоторому процессу A требуется асинхронный процесс B для возврата объекта или выполнения чего-либо до выполнения после определенной точки. Скорее всего, в этих типах сценариев происходит то, что основной поток продолжает или не ожидает заполнения объекта другой подпрограммой.

Надеюсь, это поможет.

...