Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Не могу в setInterval вызвать метод объекта (https://javascript.ru/forum/misc/40966-ne-mogu-v-setinterval-vyzvat-metod-obekta.html)

Talker 26.08.2013 16:33

Не могу в setInterval вызвать метод объекта
 
Привет!

Есть вот такой несложный объект:
var MyMsg = {
	// отправка сообщения -------------------------------------------------
	sendMsg: function (myid) {
		// проверим AJAX-ом не добавлялось ли сегодня такое сообщение
		ReadFromSrv(
			'ajaxresp',
			'chkmsg.php',
			'text='+$('TXT').value+ '&myid='+myid,
			'GET'
		);
		// ждем ответа и отправим форму
		var tmr = setInterval(
			function () {this.sendFormOnResponce();},
			20 // интервал в милисекундах
		);
	}
	// отправить форму -----------------------------------------------------
	sendForm: function () {
		$('BAD').value = 'BAD';
		$('msgadd').submit();
	},
	// если пришел ответ от сервера, то отправим форму ---------------------
	sendFormOnResponce: function () {
		var res = '';
		//проверка есть ли уже ответ от сервера
		if ($('ajaxresp').value != '') {
			res = $('ajaxresp').value;
		} else {
			res = false;
		}
		// если все хорошо, отправить форму
		if (res) {
			// остановим таймер
			clearInterval(tmr);
			if (res === '0') {
				// отправляем форму
				this.sendForm();
			} else {
				// сервер вернул текст. покажем его
				alert(res);
			}
		}
	},
}

Значит, этот код располагается на странице в разделе <BODY> в начале.

На странице есть кнопка у которой в onclick прописано:
onclick="javascript:MyMsg.sendMsg('$hash');"


Страница загружается без ошибок.
При нажатии на кнопку случается ошибка:
Uncaught exception: TypeError: 'this.sendFormOnResponce' is not a function

Т.е. при нажатии взводится setInterval, которой передается функция this.sendFormOnResponce, и которую JS функцией считать не хочет...

Никак не пойму, отчего такая ошибка. Что я делаю не так?

p.s. в не-объектном виде (т.е. в виде набора из отдельных процедур) это все работает, я учусь работать через объекты.

Яростный Меч 26.08.2013 16:42

...
var th = this;
this._tmr = setInterval(
    function () {th.sendFormOnResponce();},
    20 // интервал в милисекундах
);



...



// остановим таймер
clearInterval(this._tmr);
...

Talker 26.08.2013 17:05

А почему так? В setInterval не передается значение this?

Яростный Меч 26.08.2013 17:15

не передается.

Talker 26.08.2013 17:16

Понятно, спасибо)


Часовой пояс GMT +3, время: 22:49.