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 просмотра
Решения вопроса 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, если вы их не знаете.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы