Задать вопрос
eruditecat
@eruditecat
Красноглазик

Как внутри callback перезаписать свойство объекта this, переданного с помощью bind()?

Следующий код создаёт объект map, содержащий метод ipgeobaseCoords(). Последний выполняет GET-запрос и передаёт результат анонимной callback-функции в XML. Так же в callback передаётся и сам объект map с помощью bind(this).

var mapEngine = function (target) {
  // Немного кода который сейчас не важен.
};

mapEngine.prototype.ipgeobaseCoords = {};
mapEngine.prototype.clientIP = '???.???.???.???';

mapEngine.prototype.ipgeobaseSetCoords = function () {
	$.ajax('//ipgeobase.ru:7020/geo', {
		method: 'get',
		dataType: 'xml',
		data: { ip: this.clientIP },
		success: function (xml) {
			var	_xml = $(xml),
				 	lat = _xml.find('lat'),
				 	lng = _xml.find('lng');

			if (lat.length > 0 && lng.length > 0) {             // Получили данные, проверили.

				alert (Object.keys(this.ipgeobaseCoords).length); // Выведет "0": свойство доступно.
                                                          // Иначе в консоль вернулось бы
                                                          // сообщение об ошибке.

				this.ipgeobaseCoords.lat = lat.first().html();    // Пишем данные.
				this.ipgeobaseCoords.lng = lng.first().html();    // Пишем данные.

				alert (Object.keys(this.ipgeobaseCoords).length); // Проверяем, возвращает "2". Всё ОК.
			}
		}.bind(this)
	});
};

$(function(){
	var map = new mapEngine('map');                  // Создаём объект.
	map.ipgeobaseSetCoords();                        // Выполняем метод.
	alert (Object.keys(map.ipgeobaseCoords).length); // Проверяем. Опа! Выводит "0".
});


Что это значит: this успешно передаётся в callback-функцию, но при этом его свойства могут меняться только в её пределах. Пробовал создать отдельный метод специально для записи значения, вызывая его аналогичным образом - работает точно так же.

И что же делать теперь?
  • Вопрос задан
  • 144 просмотра
Подписаться 1 Оценить Комментировать
Решения вопроса 1
eruditecat
@eruditecat Автор вопроса
Красноглазик
Всё оказалось банально: вызов AJAX-запроса - асинхронный. Всё прекрасно работает, если добавить async: false в параметры запроса. Но синхронный AJAX - это не очень хорошо, поэтому порядок вызова методов нужно перестроить.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы