Jquery Ajax / getJSON Javascript Вопрос - PullRequest
       3

Jquery Ajax / getJSON Javascript Вопрос

0 голосов
/ 01 сентября 2011

Я все еще пытаюсь выяснить все это, и я сталкиваюсь с действительно странной ошибкой.

Я использовал getJSON, но после поиска решений этой проблемы я обнаружил, что лучше попытатьсяиспользуйте функцию AJAX (для захвата ошибок -> который не запускается).

Используя точки останова в firebug, если я медленно прохожу бегущий код, он работает (в основном) нормально (просто нужно изменить некоторые координаты для лучшего рисования).Но если я позволю ему работать с нормальной скоростью, он попытается сделать обратный вызов до того, как будет возвращен объект json.Консоль Firebug говорит, что все работает нормально (код 200), но при проверке jobj внутри объекта / функции корабля она выглядит как «неопределенная или нулевая»

После точек останова вызовы ajax, похоже, собираются "ошибка ", а не" успех ".Но это не срабатывание оповещения ...

Кроме того, ответ занимает около 300-500 мс ... это нормально?или мне нужно найти лучший сервер?

Отредактированный код:

var init = (function(){
            thisplayer = new player();
            jQuery.ajax({type: "GET", url: "shipdata.php", processData: true, data: {shipid:1}, dataType: "json",
                success: function(json) {
                    var pship = new ship(json);
                    player_ship = $.extend(thisplayer, pship);
                    starfield = new starfield();
                    for(var i = 0; i < player_ship.enemytotal; i++) {
                            $.ajax({
                                type: "GET",
                                url: "shipdata.php",
                                processData: true,
                                data: {shipid:Math.round((Math.random()*2+2))},
                                dataType: "json",
                                success: function(json) {
                                    var enemy = new ship(json);
                                    game.enemies.push(enemy);
                                },
                                error: function(x,y,z) {
                                // x.responseText should have what's wrong
                                    alert(x.responseTest);
                                }
                            });
                        }
                    game.initialized = true;
                },
                error: function(x,y,z) {
                // x.responseText should have what's wrong
                    alert(x.responseTest);
                }
            });


        })

..............................

var ship = (function(json){
        var self = this;
        jobj = jQuery.parseJSON(json.responseText);
        self.height = jobj.height;
        self.width = jobj.width;
        self.xinit = jobj.xinit;
        self.yinit = jobj.yinit;
        self.speed = jobj.speed;
        self.weapons = jobj.weapons;
        self.maxlasers = jobj.maxlasers;
        self.imagesrc = jobj.imgurl;
        self.lasers = [];
        self.x = self.xinit;
        self.y = self.yinit;

JSON отправляется в:

{"height":75,"width":50,"xinit":275,"yinit":525,"speed":3,"weapons":[1,2],"maxlasers":2,"imgurl":"images\/ship.png"}

Демонстрационная версия:

http://www.schennshome.net/medicalmmj/practice/index.html (Коддалеко не идеальный, я бегу через это, чтобы попытаться поймать различные ошибки перед анимацией, но не могу пройти через это.)

1 Ответ

1 голос
/ 01 сентября 2011

Я копался в вашем исходном коде, и проблема фактически не отображается в вашем вопросе. Проблема в этой строке, которая следует за вашим вызовом Ajax:

player_ship = $.extend(thisplayer, game.pship);

game.pship относится к данным, возвращаемым вызовом ajax, но, поскольку это асинхронно, вышеупомянутая строка будет оценена первой, что означает, что game.pship не будет определено.

Чтобы это исправить, вам нужно включить весь код в функцию init, которая в данный момент находится под вызовом ajax, непосредственно в обратный вызов success. Это предотвратит оценку кода до тех пор, пока не будет возвращен вызов ajax.

Причина, по которой он работает с точками останова, заключается в том, что это прерывает вычисление, что позволяет завершить вызов ajax до обращения к game.pship.

Редактировать

Теперь я получаю сообщение об ошибке в строке 489 о том, что player_ship не определено. Это опять-таки из-за порядка оценки асинхронного кода. Проблема в том, что player_ship определяется внутри функции ajax в init сейчас, но на него ссылаются в gameLoop, вне этого обратного вызова.

Вот как бы я переписал gameLoop:

var callback = function() {
  game.canvas.clearCanvas();
  drawStarfield();

  if(player_ship.alive && game.initialized && !(game.loading)) {
    drawPlayer();
    drawLaser();
    drawEnemies();
  }
};

if(game.initialized==false) {
  init(callback);
} else {
  callback();
}

А затем измените init, чтобы принять метод обратного вызова, который вызывается в нижней части вашего success обратного вызова. Таким образом, если игра не была инициализирована (а player_ship еще не определена), она будет выполнена после вызова ajax.

...