как остановить работу функции?
привет всем, подскажите пожалуйста
// 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"? сори если не в тот раздел.. |
Эм.. я так понял ты должен интервал после функции писать, что бы вышло:
function load_new_msg(){
if(...){
clearInterval(intervalID);
}
$.ajax({
// тут запрос
});
}
var intervalID = setInterval(load_new_msg, 5000);
|
Цитата:
|
Цитата:
и кстати сама функция вообще не выполняется на 1000 ставил Цитата:
|
Цитата:
|
Цитата:
Цитата:
Нужно остановить таймер при повторном вызове функции, так? Тогда тебе нужно хранить идентификатор таймера в глобальном пространстве, а не внутри функции:
function load_new_msg(dialog_sender_id,dialog_receiver_id,dialog_pid,dialog_offset){
if (intervalID)
сlearInterval(intervalID)
window.intervalID = setInterval(function() {
$.ajax({
});
}, 5000);
}
|
Цитата:
Цитата:
|
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 |
Цитата:
|
Вот полный скрипт:
// 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);
}
|
Кстати, я пробовал еще один вариант, убрать полностью функцию load_new_msg и перенести ее на то место где вызывается она в 1 функции, результат тот же.
|
Цитата:
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 переназвать как-нибудь по-нормальному. |
Цитата:
Или создай пустой объект ob={} (перед вызом функции, в глобальной области) и замени все window.intervalID и intervalID на ob.IntervalID |
Цитата:
|
Erolast,
Но я все равно не врубаюсь, как его код мог работать. Я не увидел в этом куске, где объявлен intervalID кроме этой самой функции, о которой разговор. Так почему же она у него не падает с ошибкой при первом же вызове? Значит intervalID должен быть где-то еще объявлен, правильно? |
Цитата:
и да заработало, но правда пишет при загрузке ошибку ReferenceError: \u0441learInterval is not defined но теперь другая проблема встала, как удалить все переменные dialog_sender_id,dialog_receiver_id,dialog_pid,dia log_offset перед загрузкой load_new_msg ? просто присвоить им всем NULL ? и наверное придется делать их глобальными, чтобы всегда одни и те же использовались? правда как их уничтожить я не знаю, они у меня через var объявлены Цитата:
http://javascript.ru/forum/events/48...tml#post321166 |
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? |
Цитата:
при первом вызове не вызывается intervalID, он вызывается после того как отрабатывает функция load_new_msg, вот тогда и выходит ошибка 1 раз. но это не важно. надо как то уничтожить переменные все что попадают в функцию. я выше писал какие. |
Цитата:
Цитата:
Цитата:
|
Цитата:
пробовал удалять/обнулять/перезаписывать все равно остаются те значения которые попали при загрузке страницы UPD: странно заработало удаление переменных вот такое: dialog_sender_id = null; dialog_receiver_id = null; dialog_pid = null; dialog_offset = null; а до этого несколько раз перезагружал страницу, показывало всегда одинаковое значение в них. |
Один вызов функции, одно замыкание - одни переменные, и никак иначе быть впринципе не может. Ты там что-то напутал.
|
Цитата:
Цитата:
|
Цитата:
|
$(window).focus(function() {
window.is_active = true;
});
$(window).blur(function() {
window.is_active = false;
});
И, соответственно, в вызываемую по интервалу функцию проверку на window.is_active пропиши. |
Цитата:
Огромное спасибо за помошь!!! |
| Часовой пояс GMT +3, время: 21:38. |