Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   как остановить работу функции? (https://javascript.ru/forum/events/48719-kak-ostanovit-rabotu-funkcii.html)

cOAPerator 14.07.2014 13:49

как остановить работу функции?
 
привет всем, подскажите пожалуйста

// AUTOLOAD NEW MESSAGE
function load_new_msg(dialog_sender_id,dialog_receiver_id,dialog_pid,dialog_offset){
	
	сlearInterval(intervalID) // НЕ работает

	intervalID = setInterval(function() {
		
		$.ajax({
			// тут запрос
		});
		
	}, 5000);
	
}


эта функция запускается другой функцией, как мне остановить/уничтожить полностью предыдущую запущеную функцию "load_new_msg"?





сори если не в тот раздел..

hfts_rider 14.07.2014 14:41

Эм.. я так понял ты должен интервал после функции писать, что бы вышло:
function load_new_msg(){
  if(...){
    clearInterval(intervalID);
  }
  $.ajax({
      // тут запрос
  });

}

var intervalID = setInterval(load_new_msg, 5000);

newobject 14.07.2014 16:29

Цитата:

Сообщение от cOAPerator
уничтожить полностью предыдущую запущеную функцию "load_new_msg"?

В этой предыдущей id выставлен в intervalID? Т.е. имена совпадают?

cOAPerator 14.07.2014 17:33

Цитата:

Сообщение от hfts_rider (Сообщение 321023)
Эм.. я так понял ты должен интервал после функции писать, что бы вышло:
function load_new_msg(){
  if(...){
    clearInterval(intervalID);
  }
  $.ajax({
      // тут запрос
  });

}

var intervalID = setInterval(load_new_msg, 5000);

я так пробовал, не работает, пишет Uncaught ReferenceError: intervalID is not defined
и кстати сама функция вообще не выполняется на 1000 ставил

Цитата:

Сообщение от newobject (Сообщение 321047)
В этой предыдущей id выставлен в intervalID? Т.е. имена совпадают?

да, имена совпадают, выставлен, но не работает, функция продолжает выполняться.

newobject 14.07.2014 18:45

Цитата:

Сообщение от cOAPerator
да, имена совпадают, выставлен, но не работает, функция продолжает выполняться.

Выложи сюда другую функцию, ту, где первый setInterval определен.

Erolast 15.07.2014 09:48

Цитата:

как мне остановить/уничтожить полностью предыдущую запущеную функцию
Чо?
Цитата:

сlearInterval(intervalID) // НЕ работает

А что, по-твоему, тут должно произойти? На момент вызова clearInterval переменная intervalID еще даже не объявлена.

Нужно остановить таймер при повторном вызове функции, так? Тогда тебе нужно хранить идентификатор таймера в глобальном пространстве, а не внутри функции:
function load_new_msg(dialog_sender_id,dialog_receiver_id,dialog_pid,dialog_offset){
    
    if (intervalID)
        сlearInterval(intervalID)
 
    window.intervalID = setInterval(function() {
         
        $.ajax({

        });
         
    }, 5000);
    
}

newobject 15.07.2014 11:01

Цитата:

Сообщение от Erolast
еще даже не объявлена

Возможно она объявлена у него в другой функции. Если бы она была не объявлена, программа бы падала в этом месте. Надо код смотреть.
Цитата:

Сообщение от Erolast
хранить идентификатор таймера в глобальном пространстве, а не внутри функции:

У него он и так в глобале.

newobject 15.07.2014 11:21

Erolast,
вот такой вариант возможен

fu1=function(){
id=setInterval(function(){console.log(1)}, 100)
setTimeout(fu2, 1000)
}
fu2=function(){
clearInterval(id)
id=setInterval(function(){console.log(2)}, 10000)
}

setTimeout(function(){clearInterval(id)}, 50000)
fu1()

1
1
1
1
1
1
1
1
1
2
2
2
2

cOAPerator 15.07.2014 15:27

Цитата:

Сообщение от Erolast (Сообщение 321103)
Чо?

А что, по-твоему, тут должно произойти? На момент вызова clearInterval переменная intervalID еще даже не объявлена.

Нужно остановить таймер при повторном вызове функции, так? Тогда тебе нужно хранить идентификатор таймера в глобальном пространстве, а не внутри функции:
function load_new_msg(dialog_sender_id,dialog_receiver_id,dialog_pid,dialog_offset){
    
    if (intervalID)
        сlearInterval(intervalID)
 
    window.intervalID = setInterval(function() {
         
        $.ajax({

        });
         
    }, 5000);
    
}

Uncaught ReferenceError: intervalID is not defined

cOAPerator 15.07.2014 15:41

Вот полный скрипт:
// LOAD DIALOG
$('a[id^="dialog_load_"]').on('click.namespace1', function(){

	var dial_lnk = $(this).attr('id').split("_");
	var dialog_sender_id = dial_lnk[2];
	var dialog_receiver_id = dial_lnk[3];
	var dialog_pid = dial_lnk[4];
	var dialog_offset = 3;

	$('#im_msg_box').empty();
	$('#im_msg_box').append('<div id="im_content_wrap" style="">'+
									'</div>'+
									'<div id="im_control_wrap" style="">'+
										'<div class="im_label"><img src="/content/avatars/noavatar.png"></div>'+
										'<div class="im_text">'+
											'<textarea id="msg_text" name="im_msg_new" placeholder="текст сообщения"></textarea>'+
										'</div>'+
										'<div class="im_send_btn">'+
											'<button type="submit" class="gl_btn post_submit">отправить</button>'+
										'</div>'+
									'</div>');
	
	$.ajax({
		type: 'post',
		url: '/library/im/im_handler.php',
		data: 'query_type=dialog_load&dialog_sender_id='+dialog_sender_id+
'&dialog_receiver_id='+dialog_receiver_id+'&dialog_pid='+dialog_pid,
		success: function(data){
			data = JSON.parse(data);
			$('#im_content_wrap').empty();
			$('#im_content_wrap').append('<div id="im_content" style="">'+data.dataArray+'</div>');
			animateToNewMsg();
			
			// тут вызывается загрузка новых сообщений
			load_new_msg(dialog_sender_id,dialog_receiver_id,dialog_pid,dialog_offset);
			
		}
	});

});


// AUTOLOAD NEW MESSAGE
function load_new_msg(dialog_sender_id,dialog_receiver_id,dialog_pid,dialog_offset){
	
	if (intervalID)
	  сlearInterval(intervalID)
  
    window.intervalID = setInterval(function() {
		
		$.ajax({
			type: "post",
			url: '/library/im/im_handler.php',
			data: 'query_type=message_autoload&dialog_sender_id='+dialog_sender_id+
'&dialog_receiver_id='+dialog_receiver_id+'&dialog_pid='+dialog_pid+'&dialog_offset='+dialog_offset,
			success: function(data){
				data = JSON.parse(data);
				//alert(data.dataArray);
			$('#im_content').append('<div style="">'+data.dataArray+'</div>');
				animateToNewMsg();
			}
		});
				
		animateToNewMsg();
		
	}, 5000);
	
}

cOAPerator 15.07.2014 15:53

Кстати, я пробовал еще один вариант, убрать полностью функцию load_new_msg и перенести ее на то место где вызывается она в 1 функции, результат тот же.

Erolast 15.07.2014 16:55

Цитата:

Uncaught ReferenceError: intervalID is not defined
А, тьфу, вот так:
function load_new_msg(dialog_sender_id,dialog_receiver_id,dialog_pid,dialog_offset){
     
    if (window.intervalID)
        сlearInterval(window.intervalID)
  
    window.intervalID = setInterval(function() {
          
        $.ajax({
 
        });
          
    }, 5000);
     
}

Но лучше intervalID переназвать как-нибудь по-нормальному.

newobject 15.07.2014 17:25

Цитата:

Сообщение от cOAPerator
if (intervalID)
сlearInterval(intervalID)

window.intervalID = setInterval(function() {

Попробуй в этом вот куске заменить все intervalID на window.intervalID.

Или создай пустой объект ob={} (перед вызом функции, в глобальной области) и замени все window.intervalID и intervalID на ob.IntervalID

newobject 15.07.2014 17:39

Цитата:

Сообщение от Erolast
А я типа что-то другое предложил?

Я просто не видел, я отвечал на сообщение на предыдущей странице.:)

newobject 15.07.2014 17:49

Erolast,
Но я все равно не врубаюсь, как его код мог работать. Я не увидел в этом куске, где объявлен intervalID кроме этой самой функции, о которой разговор. Так почему же она у него не падает с ошибкой при первом же вызове? Значит intervalID должен быть где-то еще объявлен, правильно?

cOAPerator 15.07.2014 18:02

Цитата:

Сообщение от Erolast (Сообщение 321177)
А, тьфу, вот так:
function load_new_msg(dialog_sender_id,dialog_receiver_id,dialog_pid,dialog_offset){
     
    if (window.intervalID)
        сlearInterval(window.intervalID)
  
    window.intervalID = setInterval(function() {
          
        $.ajax({
 
        });
          
    }, 5000);
     
}

Но лучше intervalID переназвать как-нибудь по-нормальному.

название intervalID я поменял на другое, более понятное.
и да заработало, но правда пишет при загрузке ошибку ReferenceError: \u0441learInterval is not defined

но теперь другая проблема встала, как удалить все переменные dialog_sender_id,dialog_receiver_id,dialog_pid,dia log_offset
перед загрузкой load_new_msg ?
просто присвоить им всем NULL ?
и наверное придется делать их глобальными, чтобы всегда одни и те же использовались?

правда как их уничтожить я не знаю, они у меня через var объявлены




Цитата:

Сообщение от newobject (Сообщение 321184)
Erolast,
Но я все равно не врубаюсь, как его код мог работать. Я не увидел в этом куске, где объявлен intervalID кроме этой самой функции, о которой разговор. Так почему же она у него не падает с ошибкой при первом же вызове? Значит intervalID должен быть где-то еще объявлен, правильно?

тут посмотри поймешь почему при 1 вызове нет ошибки
http://javascript.ru/forum/events/48...tml#post321166

newobject 15.07.2014 18:28

cOAPerator,
Я смотрел. У тебя первый запуск этой функции идет из

success: function(data){
29 data = JSON.parse(data);
30 $('#im_content_wrap').empty();
31 $('#im_content_wrap').append('<div id="im_content" style="">'+data.dataArray+'</div>');
32 animateToNewMsg();
33
34 // тут вызывается загрузка новых сообщений
35 load_new_msg(dialog_sender_id,dialog_receiver_id,d ialog_pid,dialog_offset);
36
37 }

До этого intervalID нигде не определен. Из ифа идет обращение к неопределенной переменной. На этом месте должна генерироваться ошибка. Может у тебя он определен в animateToNewMsg?

cOAPerator 15.07.2014 18:38

Цитата:

Сообщение от newobject (Сообщение 321189)
cOAPerator,
До этого intervalID нигде не определен. Из ифа идет обращение к неопределенной переменной. На этом месте должна генерироваться ошибка. Может у тебя он определен в animateToNewMsg?

нет там только анимация, 1 строка и все.
при первом вызове не вызывается intervalID, он вызывается после того как отрабатывает функция load_new_msg, вот тогда и выходит ошибка 1 раз.
но это не важно.

надо как то уничтожить переменные все что попадают в функцию. я выше писал какие.

Erolast 15.07.2014 18:46

Цитата:

Erolast,
Но я все равно не врубаюсь, как его код мог работать. Я не увидел в этом куске, где объявлен intervalID кроме этой самой функции, о которой разговор. Так почему же она у него не падает с ошибкой при первом же вызове? Значит intervalID должен быть где-то еще объявлен, правильно?
Я решил, что он как раз падает.
Цитата:

и да заработало, но правда пишет при загрузке ошибку ReferenceError: \u0441learInterval is not define
Перепиши заново clearInterval, у тебя там с русская.

Цитата:

надо как то уничтожить переменные все что попадают в функцию. я выше писал какие.
Зачем? Переменные уничтожит сборщик мусора сразу после того, как к ним потеряется доступ, то есть, после остановки замкнувшего их интервала.

cOAPerator 15.07.2014 18:53

Цитата:

Сообщение от Erolast (Сообщение 321194)
Зачем? Переменные уничтожит сборщик мусора сразу после того, как к ним потеряется доступ, то есть, после остановки замкнувшего их интервала.

потому что эти же переменные используются без перезагрузки страницы, но почему то не попадают новые значения в них. остаются старые.

пробовал удалять/обнулять/перезаписывать
все равно остаются те значения которые попали при загрузке страницы

UPD: странно заработало удаление переменных вот такое:

dialog_sender_id = null;
dialog_receiver_id = null;
dialog_pid = null;
dialog_offset = null;

а до этого несколько раз перезагружал страницу, показывало всегда одинаковое значение в них.

Erolast 15.07.2014 19:00

Один вызов функции, одно замыкание - одни переменные, и никак иначе быть впринципе не может. Ты там что-то напутал.

newobject 15.07.2014 19:03

Цитата:

Сообщение от cOAPerator
после того как отрабатывает функция load_new_msg

Правильно, я об этом и говорю, что на вызове load_new_msg у тебя должно упасть. Но ты же в стартовом посте писал, что у тебя не в этм проблема
Цитата:

как мне остановить/уничтожить полностью предыдущую запущеную функцию "load_new_msg"?
Если ты пишешь что тебе нужно остановить ее (хотя точней не ее, а процесс, запущеный из нее), значит единожды хотя бы она должна была отработать? А как она могла отработать, если она валится.

cOAPerator 15.07.2014 20:24

Цитата:

Сообщение от Erolast (Сообщение 321197)
Один вызов функции, одно замыкание - одни переменные, и никак иначе быть впринципе не может. Ты там что-то напутал.

я это понял уже. у меня еще один вопрос, как остановить выполнение AJAX если неактивна вкладка браузера, или сам браузер?

Erolast 15.07.2014 21:48

$(window).focus(function() {
  window.is_active = true;
});
$(window).blur(function() {
  window.is_active = false;
});

И, соответственно, в вызываемую по интервалу функцию проверку на window.is_active пропиши.

cOAPerator 16.07.2014 10:56

Цитата:

Сообщение от Erolast (Сообщение 321217)
$(window).focus(function() {
  window.is_active = true;
});
$(window).blur(function() {
  window.is_active = false;
});

И, соответственно, в вызываемую по интервалу функцию проверку на window.is_active пропиши.

понял, все уже применил.

Огромное спасибо за помошь!!!


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