Задать вопрос

JQuery — Как при исполнении Ajax передать в callback вызывающий объект?

Здравствуйте уважаемые старожилы JS.



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



Сферический стенд таков: Есть класс, который должен подсчитывать количества удачных ajax запросов. Из класса создается объект, следовательно не класс (статические методы), а объект начинает хранить у себя результаты удач/попыток. Можно создать несколько таких объектов, например для решения задачи тестирования нескольких серверов в онлайн.



Но есть проблема, которая как я уже написал, могу сформулировать в коде:

// Создадим условный класс<br>
var CClass = function() {<br>
	this.success = 0;		// количество удачных попыток<br>
	this.tries = 0;		// количество попыток посылки сообщения<br>
	<br>
	// пропустите метод на текущий момент, смотрите ниже<br>
	this.get = function() {<br>
		this.addTries();<br>
		jQuery.get(window.location.href, function(){<br>
			//this.addSuccess();	- упс this !== текущему объекту<br>
			//CClass.addSuccess();	- обращение к статическому методу не правильно<br>
			// как вызвать this.addSuccess() у объекта который вызвал callback?<br>
		})<br>
	};<br>
	<br>
	this.addSuccess = function(){<br>
		this.success++;<br>
	};<br>
	<br>
	this.addTries = function(){<br>
		this.tries++;<br>
	};<br>
}<br>
<br>
var obj = new CClass();<br>
<br>
obj.get();	// смотим в CClass.get<br>




От себя добавлю.

Если дело касается разработки интерфейса, где есть всего набор статических классов (фактически неймспейсов), то эти callback-и обрабатываются легко. А в случае с динамическим кодом каким я привел вам выше, я просто «теряю данный объект из вида». Прошу так же заметить, я не держу obj в глобальной видимости, на него ссылки нет, она может быть создана где угодно. Мне важно, что бы продолжение обработки после ajax приходился на тот же объект.



Как-то давно работал в C#, там есть стандарт передавать в параметрах обязательный eventSender объект (объект который вызвал данное событие). В JavaScript (jQuery) я этого с ходу не нашел, возможно я что-то делаю не так. Прошу помощи.



UPD:

Спасибо благодаря вам нашел распрекрасную статью, рекомендую к прочтению. Спасибо.

learn.javascript.ru/bind
  • Вопрос задан
  • 4973 просмотра
Подписаться 10 Оценить Комментировать
Решения вопроса 1
k12th
@k12th
console.log(`You're pulling my leg, right?`);
jQuery.get(window.location.href, $.proxy(this.addSuccess, this))

Если старые браузеры не нужны, то

jQuery.get(window.location.href, this.addSuccess.bind(this))
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@egorinsk
Можно сохранить this в переменную.


this.addTries();
var self = this;
jQuery.get(window.location.href, function(){
self.doWhateverYouneed();


Также, вам наверняка будет интересно прочесть про замыкания на learn.javascript.ru, если вы их не знаете.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы
Rocket Смоленск
от 80 000 до 130 000 ₽
div. Ставрополь
от 40 000 до 90 000 ₽
Wanted. Санкт-Петербург
До 220 000 ₽
18 дек. 2024, в 11:57
500 руб./в час
18 дек. 2024, в 11:54
2000 руб./за проект