Почему setTimeout не работает?
Вот есть такая функция и она по факту работает но по какой-то причине setTimeout игнорируется и не ждёт время до повторного запуска а лишь бесчисленное раз запускает функцию, как это можно исправить и может есть какие-то варианты получше как это реализовать?
1 2 3 4 5 6 7 8 9 10 11 12 13
function slideshow(j,i){ if(i > 2){ i = 0; } if(j > 2){ j = 0; } imgarr[j].style.display = "none"; imgarr[i].style.display = "block"; console.log(i); console.log(j); setTimeout(slideshow(j+1,i+1), 50000); }
Почему то неработают setTimeout
Доброго(тем у кого батареи топят) утра. //если коротко for(var i = 0; i <=6; i++)< .
Не работает setTimeout()
function initialization()< var el = < step : 0, func : function()< alert( el.step ); .
медленно работает setTimeout в IE
один и тотже скрипт применяемый с помощью setTimeout с разной скоростью работает например в мозиле.
Странно работает setTimeout
Здравствуйте. У меня есть две функции: 1. $(document).ready(function()< .
У вас функция setTimeout находится внутри функции slideshow которую сама и вызывает Бесконечная рекурсия до переполнения стека вызовов.
Вам надо сколько-то раз запустить функцию slideshow через 50 секунд типа?
Сообщение было отмечено DaniilPo как решение
Решение
Тогда это делается другой функцией — setInterval()
"use strict"; let i = 10; let timer = setInterval(() => { console.log(i); i--; if (i 0) { clearInterval(timer); } }, 1000);
Сообщение было отмечено DaniilPo как решение
Решение
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
function slideshow(j, i) { if (i > 2) { i = 0; } if (j > 2) { j = 0; } imgarr[j].style.display = "none"; imgarr[i].style.display = "block"; console.log(i); console.log(j); setTimeout(function () { slideshow(j + 1, i + 1); }, 5000); }
Сообщение от KingdaKa
Каждый начинающий js-программист, должен 101 раз повесить свой бровзер бесконечным циклом и запилить очередную, неизвестную по счёту, подсветку синтаксиса кода.
Это точно. А недостаток реализации с setTimeout в том, что функция занимает весь поток, а setInterval работает как прерывание в процессоре независимо и можно вычислять что-то, реагировать на события и т.д. Правильно?
Сообщение было отмечено DaniilPo как решение
Решение
Сообщение от KingdaKa
Причастившиеся и просветлённые уже давно утверждают, что рекурсивный setTimeout() предпочтительнее setInterval(), по причине того, что вы уже написали, . и интервал выдерживается точнее.
- Рекурсивный setTimeout () гарантирует такую же задержку между выполнениями. (Например, 100 мс в приведённом выше случае.) Код будет запущен, затем подождёт 100 миллисекунд, прежде чем запустится снова, поэтому интервал будет одинаковым, независимо от того, сколько времени требуется для выполнения кода.
- Пример с использованием setInterval () работает несколько иначе. Выбранный вами интервал включает время, затрачиваемое на выполнение кода, который вы хотите запустить. Предположим, что выполнение кода занимает 40 миллисекунд — тогда интервал составляет всего 60 миллисекунд.
- При рекурсивном использовании setTimeout () каждая итерация может вычислять различную задержку перед запуском следующей итерации. Другими словами, значение второго параметра может указывать другое время в миллисекундах для ожидания перед повторным запуском кода.
Сообщение от klyapa
Причастившиеся и просветлённые уже давно утверждают, что рекурсивный setTimeout() предпочтительнее setInterval(), по причине того, что вы уже написали, . и интервал выдерживается точнее.
Все зависит от задачи, конечно А для чего нужен строгий интервал прям до мс, ну кроме анимации какой-то?
В вебе трудно представить задачи, где нужны адские вычисления, которые так уж сильно помешают работе setInterval. Кроме того на прерывания обычно вещают какие-то очень мелкие задачи типа таймеров, опросов девайсов аля клавиатуры и проч. Там особая точность не нужна
Периодически не срабатывает setTimeout — в чём может быть проблема?
Есть функция которая срабатывает при setTimeout — периодически не срабатывает.
Как проверить причину — на сайте много всякого шлака который подгружается — нужно выставить этот setTimeOut в приоритет — думаю проблема в стеке задач — но не хватает опыта отладить процесс) но может быть ещё в чём-то)
Простой 3 комментария
«Периодчески не срабатывает setTimeOut — в чём может быть проблема?» — проблема в том, что вы работаете в блокноте. Уже много много лет для разработки используют IDE которая решает все подобные проблемы,
Григорий, эээ, ну а чего вы ожидаете показывая код в котором используются несуществующие ни в спеке ни в DOM функции? Это сразу бросилось в глаза, поэтому вам об этом и написали. Ну ладно, раз от руки то понятно. Мне просто в голову не могло придти, что на технических форумах есть люди, которые могут в топик конкретного технического вопроса написать код не имеющий отношения к вопросу, да ещё и от руки,
Ну тогда справедливо всё что вам ниже написали — какая-то часть вашего алгоритма проседает, то есть либо условие не выполняется, либо еще что. Я сильно сомневаюсь, что вам нужна помощь со стороны, потому что это всё решается дебагом — просто сидите и проверяете каждую часть алгоритма выводами в консоль например, исправляете те места которые работают не так как нужно
Если действительно сам алгоритм правильный, и всё ломается из-за каких-то сторонних эффектов, то всё уже сложнее. Если например вы считаете, что сторонние скрипты сбрасывают таймауты, то можно попробовать декорировать clear* и посмотреть действительно ли какой-то скрипт их вызывает для массового сброса:
(() => < [ 'clearInterval', 'clearTimeout' ].forEach(method_name => < const original_method = window[ method_name ]; window[ method_name ] = function() < console.log(`method $< method_name >is called with arguments:`, arguments) return original_method.apply(this, arguments) > >) >)()
Курсы javascript
Здравствуйте! Мне уже помогли на этом форуме, попробую еще раз.))) Я дизайнер, а не программист и в javascript полный чайник.
Есть простейший баннер сделанный для примера Adobe Animate: круг движется по прямой до границ баннера и обратно. Хочу его остановить через заданное время. Если использую просто stop(), то проигрывание останавливается в любом кадре, а если использую setTimeout, то ничего не происходит, причем Alert прекрасно срабатывает. в чем проблема?
(function (lib, img, cjs, ss) < var p; // shortcut to reference prototypes // library properties: lib.properties = < width: 240, height: 400, fps: 24, color: "#FFFFFF", manifest: [] >; // symbols: (lib.Символ1 = function(mode,startPosition,loop) < this.initialize(mode,startPosition,loop,<>); // Слой 1 this.shape = new cjs.Shape(); this.shape.graphics.f("#999999").s().p("AqpKpQkbkaAAmPQAAmOEbkbQEbkbGOAAQGPAAEaEbQEbEbAAGOQAAGPkbEaQkaEbmPAAQmOAAkbkbg"); this.shape.setTransform(96.5,96.5); this.timeline.addTween(cjs.Tween.get(this.shape).wait(1)); >).prototype = p = new cjs.MovieClip(); p.nominalBounds = new cjs.Rectangle(0,0,193,193); // stage content: (lib.Proba = function(mode,startPosition,loop) < this.initialize(mode,startPosition,loop,<>); // timeline functions: this.frame_0 = function() < setTimeout(function() < this.stop(); alert('Boom!'); >, 500); > this.frame_79 = function() < this.stop(); >// далее код описывающий движение.
var self = this; setTimeout(function() < self.stop(); alert('Boom!'); >, 500); >
Пожалуйста, отформатируйте свой код!
Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
Почему setTimeout не работает?
Ярослав Иванов, Я не писал, что domcontentloaded чем-то лучше onload. См. ответ. Там написано, что правильнее добавить обработчик в очередь, чем использовать один-единственный.
Если быть внимательным и прочесть последнее предложение, то можно увидеть, что я не настаиваю на каком-то одном событии и вполне можно использовать другие. В том числе, и onload.
Ярослав Иванов, Я ответил на последний вопрос в треде.
Если интересует ответ на предпоследний вопрос, читайте: https://learn.javascript.ru/onload-ondomcontentloaded
Двойку вы напишете или пятёрку куда-то там в зачётку, мне безразлично.
Сергей Яковлев, если бы вы использовали одно события вопросов бы не было а вы вместо onload предложили использовать domcontentloaded без аргументов. Ответьте уже в чем разница и закончим диалог.
Ярослав Иванов, Я предложил использовать другой стиль назначения обработчика. На каком-то одном единственно правильном событии я не настаивал.
Но, раз уж на то пошло, встречный вопрос — чем конкретно в данном конкретном случае не устраивает конкретно предложенное мною событие?
Сергей Яковлев, вы так и не ответили на вопрос а зачем-то скинули ссылку на документацию. Разве так на к экзамене поступают? На будущее всегда давайте точный ответ и аргументирует его. С вас берут пример. А пока на пересдачу.
Ярослав Иванов, Так я не на экзамене, всего лишь помогаю другим с получением новых знаний. Вот, пытался вам помочь, например.
И, кстати, вы не ответили на мой конкретно сформулированный вопрос. Но развели демагогию насчёт каких-то экзаменов, зачёток, двоек. 😉
Сергей Яковлев, вы серьёзно? Перечитайте ещё раз. Вы начали поясничать. «и?», «я знаю». Вместо того чтобы ответить. Ещё и ссылку на документацию вместо своих слов. Если по вашему это нормально то нет смысла продолжать диалог.
Ярослав Иванов, Так если нет претензий к выбранному мною событию (хотя и смысл был не в нём), то зачем было разводить тред?
И ещё — правильная ссылка вместо тысячи слов. 😉
Ярослав Иванов, И всё-таки я там немного ошибся (не критично). А вы и не поправили меня, знаток вы наш. 😀
document.addEventListener('DOMContentLoaded', main);
setTimeout откладывает выполнение функции в колбеке, он ничего не тормозит, точнее тормозит но только если неправильно используется и вы этому рады не будете.