глупых вопросов на тостере каждый день бывает полно) думаю я своим хуже не сделаю, и прошу модераторов хотя бы немного время дать пожить вопросу.
Собственно зашел спор с человеком о setTimeout в js. о том как он важен. нужен он вообще и можно ли без него обойтись. От вас, собственно, прошу придумать пример случая, когда setTimeout будет необходим. чтобы прям без него вообще никак нельзя было реализовать задуманное.
Евгений Вольф: в том что интервалы между запусками могут быть меньше чем время исполнения функции, что приведет к наложению, это исправляется таймаутом. А так да, никакой разницы.
Виталий: подождите, но alert будет выполняться уже после того как интервал будет очищен (удален), и сколько он будет выполняться - уже значения не имеет, т.к. setInterval'а, как такового уже не будет.
Виталий: А может все-таки объясните подробно, на примере приведенного в ответе кода, почему он не эквивалентен функции setTimeout?
Всегда думал, что эти две функции вполне могут взаимно заменяться - таймаут очисткой интервала, а интервал рекурсивным таймаутом.
Виталий: давайте всё-таки по порядку, холиваров тут быть никак не может, т.к. мы обсуждаем конкретный 1 вопрос и конкретный 1 пример, на одном, вполне конкретном языке.
Второй момент, единственное, что я нашел исходя из Вами сказанного выше, это:
Если функция и выполняется дольше, чем пауза setInterval, то вызовы будут происходить вообще без перерыва.
- и это не работает так. Вернее, это работает так, только в том случае, если строго следовать примеру и не очищать таймер.
Вот Вам пример кода, в котором нет setTimeout() и который не выполняется каждые 100мс. и функции друг на друга не накладываются.
function pausecomp(millis)
{
var date = new Date();
var curDate = null;
do { curDate = new Date(); }
while(curDate-date < millis);
console.log(Date.now());
x = setInterval(function() {
clearInterval(x);
pausecomp(1000);
}, 100);
}
pausecomp(1000);
Евгений Вольф: ваша функция вообще беспонтовая, вызов сетинтервал выдернет задачу из основного процесса и она пойдет выполняться асинхронно, вставка в код вашей функции ровным счетом ничего не даст... читайте статью по ссылке. Мне кажется вы слабо знаете предмет, который обсуждаете.
вызов сетинтервал выдернет задачу из основного процесса и она пойдет выполняться асинхронно
и о чем нам это говорит? Причем тут вообще наложение, о котором мы говорили изначально? setTimeout() - тоже не ставит выполнение кода на паузу до того, выполниться код указанный в setTimeout().
Вы так и не привели реального примера, но рассказываете про статью и "наложение"... Может хотя бы уточните, какое именно предложение или абзац в этой самой статье нам открыть глаза? В статье не слова про "основной поток", о котором Вы опять таки говорите, продолжая ссылаться на статью.
Евгений Вольф: статья объясняет что такое сетинтервал и таймаут, там приведены примеры в чем отличие. То что я дальше комментирую не из статьи, попробуйте задать вопрос что именно вам не понятно и возможно будет нормальный ответ. А так, у меня складывается ощущение, что вы понтите или вам просто безумно скучно.
Виталий: а у меня складывается ощущение, что Вы намеренно уходите от того, что бы привести реальный пример, а не тыкать пальцем в других. Мы изначально обсуждали конкретный вопрос автора - "можно ли обойтись без setTimeout()?", я привел два примера того, как это можно сделать, Вы же начали доказывать обратное, причем не в рамках своего ответа, а в рамках комментария под моим. Но ни одного примера не привели, а потом ещё стали обвинять меня, в своих же, по видимому, грехах. Причем привести реальный пример (и желательно основываясь на данных из той самой статьи) - по прежнему отказываетесь.
Ещё раз, обращаю Ваше внимание на важный момент: автор вопроса не спрашивал, в чем отличия между setTimeout и setInterval, он спрашивал "можно ли обойтись без setTimeout?". Я Вам даже больше скажу, в изначальном вопросе - нет вообще ни слова про setInterval.
Евгений Вольф: в контексе вопроса вашу рекомендацию можно интерпретировать как можно ли хранить переменную в массиве, одну, можно но зачем, когда есть переменная. Вот и здесь так же. Примеры не привожу, так как я с планшета, и пардон не сруки это.
Виталий: на счёт "переменных в массиве" - тут я с Вами и не пытался спорить... и даже написал, что "чисто теоретически" и "в контексте вопроса". Предлагаю мирно закончить сие обсуждение и сойтись на "ничьей" :))
Виталий: ну... на самом деле я не "завёлся", мне просто обычно очень интересно, что именно я упустил или не понял... как минимум, что бы не давать "не правильных" ответов в будущем или понять, чего я действительно не знаю. А "заводиться" применительно, к человеку, который возможно живёт на другом конце света и общается "через компьютер" - не очень разумно, я думаю Вы с этим согласитесь.
Евгений Вольф: если заглянуть в спеку https://html.spec.whatwg.org/multipage/webappapis.... интервал и таймаут это один метод вызванный с разным значением параметра "repeat", потому тут не совсем логично говорить про замену одного на другое т.к. это одно и то же. Когда вы делаете 1 раз вызов, а потом сами чистите интервал вы просто устанавливаете этот флаг повторения в false, только через костыль.