ajax и обратные вызовы

  • Автор темы Screamer2
  • 28
  • Обновлено
  • 13, May 2024
  • #1
У меня возникли проблемы с ajax и обратными вызовами. Кажется, я никогда этому не научусь, лол.

Следующий код находится в моем главном окне игры, которое является браузерным клиентом. Я вызываю набор символов, который просто извлекает имя персонажа из БД. Обратный вызов .done в jquery, похоже, запускает только одну часть.
 function CharacterTraveler()

{

this.travel = function(nameSet, areaSet, regionSet, ParserObj)

{

$.ajax({

method: "POST",

url: "php/game/set_character_location.php",

context:this,

data: { nameObj: nameSet, areaObj: areaSet, regionObj: regionSet, characterNameObj:characterName }

})

.done(function( data ) {

if(data != '')

{

alert(data);

}

});

}

}
Код (разметка): следующий код находится в файле символов.js. в качестве примечания, если я предупреждаю this.name из .done, у него есть значение, но эта функция this.return_name() никогда не хочет вызывать.

Когда я могу позвонить ему из другого места, оно не определено.
 $( '#output' ).on( 'click', 'a', {parserObj:Parser, characterItem:CharacterObj}, function(event){ var elem = event.target; switch(elem.getAttribute('type')) { case 'goto': // alert(event.data.characterItem.return_name()); //Traveler.travel(elem.getAttribute('name'), elem.getAttribute('area'), elem.getAttribute('region'), Parser); break; } });
Код (разметка): this.return_name() никогда не срабатывает. Основная проблема, которая заставила меня искать эту ошибку, — это закомментированный код из окна.
 function Character() { var name; this.set_name = function() { $.ajax({ method: "POST", url: "php/game/misc/get_character_name.php", }).done(function( data ) { if(data != '') { this.name = data; this.return_name(); } }); } this.return_name = function() { alert('In Return Name'); } }
Код (разметка): ссылки добавляются динамически из других скриптов.

При нажатии на ссылку вызывается путешествие с аргументами для обновления местоположения персонажа в БД. Это тоже не работает.
 $(document).ready(function(){ var Parser = new CommandParser(); var OutputObj = new Output(); var Traveler = new CharacterTraveler(); var CharacterObj = new Character(); CharacterObj.set_name(); $("#maininput").on("input propertychange", function(){ var val = $('#maininput').val(); Parser.update(val); }); $("#inputsubmit").click(function(){ Parser.submit_command(OutputObj); }); $( '#output' ).on( 'click', 'a', {parserObj:Parser, characterItem:CharacterObj}, function(event){ var elem = event.target; switch(elem.getAttribute('type')) { case 'goto': // alert(event.data.characterItem.return_name()); //Traveler.travel(elem.getAttribute('name'), elem.getAttribute('area'), elem.getAttribute('region'), Parser); break; } }); });
Код (разметка): Любая идея.

Это все еще мое непонимание Async и обратных вызовов? Или что-то другое?

Screamer2


Рег
16 May, 2013

Тем
1

Постов
1

Баллов
11
  • 12, Jun 2024
  • #2
Вы упускаете из виду, что область действия «this» меняется внутри обратного вызова AJAX… это одна из вещей, которую jQuery также не может нормализовать.

Проще говоря, внутри области обратного вызова «this» относится к этой анонимной функции, а не к родительскому объекту.

поэтому, когда вы назначаете «this.data=", вы назначаете его анонимной функции, а не «CharacterTraveler». ', когда вы пытаетесь вызвать this.return_name, вы пытаетесь вызвать метод, которого даже НЕ СУЩЕСТВУЕТ в функции обратного вызова, а не 'CharacterTraveler.return_name'.

Также приветствуем еще одну причину, по которой вы не могли заплатить мне за использование этой кучи дерьма — jQuery.

Вообще говоря, объекты и AJAX — одна из самых больших проблем, с которыми вы можете столкнуться.

jQuery только делает это ХУЖЕ тем, как он оборачивает AJAX абстракцией, которая удаляет из него МНОГО элементов управления - например, передает вам только данные вместо фактического объекта XMLHttpRequest или нормализованной версии эквивалента IE ActiveX.

Это потрясающий пример «ложной простоты»: упрощая его, как они это сделали, они усложнили с ним определенные действия.

Если бы вы использовали ванильный JavaScript или что-то вроде моей библиотеки элементов, я бы посоветовал вам передать «это» в объект XMLHttpRequest по ссылке, поскольку это будет передано обработчику в качестве параметра вместо бесполезного кастрированного параметра «данные». .
 

smoley


Рег
01 Jan, 2011

Тем
0

Постов
2

Баллов
2