как остановить работу функции?
привет всем, подскажите пожалуйста
// 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, время: 04:08. |