Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   setTimeout() (https://javascript.ru/forum/events/11042-settimeout.html)

DjTarik 03.08.2010 22:24

setTimeout()
 
Собственно:

setTimeout('...', 1000);
wrapper.parentNode.removeChild(wrapper);
eclipse.parentNode.removeChild(eclipse);


Пока работает таймер - функции должны ждать.

Можно ли так сделать?

P.S. Обыскал инет - сказали, что нельзя сделать паузу. Как тогда поступать в таких случаях?

Спасибо.

Kolyaj 03.08.2010 22:26

setTimeout(function() {
    wrapper.parentNode.removeChild(wrapper);
    eclipse.parentNode.removeChild(eclipse);
}, 1000);

DjTarik 03.08.2010 23:41

Цитата:

Сообщение от Kolyaj (Сообщение 66180)
setTimeout(function() {
    wrapper.parentNode.removeChild(wrapper);
    eclipse.parentNode.removeChild(eclipse);
}, 1000);

Не прокатит.А если предыдущая функция не успеет завершится за 1000 секунд? А если следующих функций будет 20? Всем ставить таймер не хочется. =(

Gvozd 04.08.2010 00:00

setTimeout(function(){
...// то, почле чгео должный выоплнится остальные функции
wrapper.parentNode.removeChild(wrapper); 
eclipse.parentNode.removeChild(eclipse);
}, 1000);
DjTarik,
ты высасываешь проблему из пальца

DjTarik 04.08.2010 00:10

Цитата:

Сообщение от Gvozd (Сообщение 66189)
setTimeout(function(){
...// то, почле чгео должный выоплнится остальные функции
wrapper.parentNode.removeChild(wrapper); 
eclipse.parentNode.removeChild(eclipse);
}, 1000);
DjTarik,
ты высасываешь проблему из пальца

Возможно вы меня не так поняли:

1. Сначала будет таймер.
2. Потом идут функции.

Было так:
setTimeout('...', 1000);
wrapper.parentNode.removeChild(wrapper);
eclipse.parentNode.removeChild(eclipse);


Пробовал так:

setTimeout('...', 1000);
setTimeout(
function() {
wrapper.parentNode.removeChild(wrapper);
eclipse.parentNode.removeChild(eclipse);
}, 2000);


Но это не вариант, т.к. я не могу точно знать, сколько времени потребуется на первый таймер.

Мне нужно - выполнить функцию после того, как отработал таймер.
В моём случае - изменение прозрачности, потом удаление объекта.

Gvozd 04.08.2010 00:46

Цитата:

Сообщение от DjTarik
Возможно вы меня не так поняли:

1. Сначала будет таймер.
2. Потом идут функции.

и в чем проблема поместить функции по удалению объекта внутрь таймера, следом за функцией изменения прозрачности?
именно так и делают все нормальные люди

ты высасываешь проблему из пальца
Цитата:

Сами себе придумываем трудности, а потом мужественно их преодолеваем

Маэстро 04.08.2010 02:16

Цитата:

Сообщение от DjTarik (Сообщение 66179)
setTimeout('...', 1000);
wrapper.parentNode.removeChild(wrapper);
eclipse.parentNode.removeChild(eclipse);

Пока работает таймер - функции должны ждать.
Можно ли так сделать?
Как тогда поступать в таких случаях?

Если Ваша ГЛАВНАЯ функция может работать неизвестное количество времени (1-1000 секунд хи-хи), то setTimeout здесь ни причем. После того как пройден оператор setTimeout('...', 1000) - следующая строчка wrapper.parentNode.removeChild(wrapper); выполнится мгновенно!
В Вашем случае надо делать систему семафоров. Есть главная функция Х, которая выполняет некую работу (вроде как изменение прозрачности чего-то). Эта функция должна по факту выполнения взвести флажок "я выполнила свою работу". По ходу Вы запускаете setTimeout('Y()', 1000); эта Y раз в секунду проверяет состояние флажка. И, как только он взведён - начинает выполнять свою работу (удаление объекта). В конце Y сбрасывает флажок.

DjTarik 04.08.2010 10:20

Цитата:

Сообщение от Маэстро (Сообщение 66198)
Если Ваша ГЛАВНАЯ функция может работать неизвестное количество времени (1-1000 секунд хи-хи), то setTimeout здесь ни причем. После того как пройден оператор setTimeout('...', 1000) - следующая строчка wrapper.parentNode.removeChild(wrapper); выполнится мгновенно!
В Вашем случае надо делать систему семафоров. Есть главная функция Х, которая выполняет некую работу (вроде как изменение прозрачности чего-то). Эта функция должна по факту выполнения взвести флажок "я выполнила свою работу". По ходу Вы запускаете setTimeout('Y()', 1000); эта Y раз в секунду проверяет состояние флажка. И, как только он взведён - начинает выполнять свою работу (удаление объекта). В конце Y сбрасывает флажок.

Вроде как setTimeout('...', 1000); начнет выполнение функции через секунду, а в это время объект уже удалится.

А про флажки - можно пример? А то мне сказали, что нереально сделать что-то типо паузы.

inGray 04.08.2010 11:11

Любую задержку можно реализовать циклами.. конечными или бесконечными. В том числе и ожидание семафора.

Kolyaj 04.08.2010 11:39

inGray,
то, что браузер зависнет, вас не смущает?

inGray 04.08.2010 11:43

Если это нужно для целей Автора, то не смущает.

subzey 04.08.2010 12:18

Вот же, проблема!
Яваскрипт однопоточный, и код с таймаутом запустится только тогда, когда пройдет нужное время и никакой код не будет выполняться.

Т.е., даже если поставить таймаут на 0, он выполнится всегда после того, как отработает функция, вызвавшая это отложенное выполнение. Таким образом, кстати, можно проверять значение value у инпута сразу после keypress. :)

inGray 04.08.2010 12:37

To subzey
Теоритический интерес:
Примерно такой цикл для проверки семафора будет работать?
function checkFlag(){
  if (flag) {
     /*действия*/
  }
  else
    setTimeout(checkFlag,500);
}

Gvozd 04.08.2010 12:42

Цитата:

Сообщение от inGray
Примерно такой цикл для проверки семафора будет работать?

будет.
только не называйте это циклом, так как это ни разу не цикл

inGray 04.08.2010 12:45

По конструкции не for и не while
:yes:
Но по сути-то цикл? А вообще ответ был дан уважаемым Gvozd, ещё на той странице.

Sweet 04.08.2010 13:02

Поразвелось му#@$ков, не продохнуть! В основах не секут, а лезут.. Учи основы!!!

Gvozd 04.08.2010 13:10

Цитата:

Сообщение от inGray (Сообщение 66219)
По конструкции не for и не while
:yes:
Но по сути-то цикл? А вообще ответ был дан уважаемым Gvozd, ещё на той странице.

странно, что ответ был дан на предыдущей странице, но вопос вы задали на этой.

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

Kolyaj 04.08.2010 13:12

Цитата:

Сообщение от Gvozd
и по сути, даже не цикл.

А давайте для чистоты спора введём понятие цикла :) А то будете тут ни о чём разговаривать.

inGray 04.08.2010 13:14

Простите дурака ) Это был ответ автору по поводу примера
Цитата:

Сообщение от DjTarik (Сообщение 66204)
А про флажки - можно пример? А то мне сказали, что нереально сделать что-то типо паузы.

PS
Цитата:

Сообщение от Kolyaj (Сообщение 66225)
А давайте для чистоты спора введём понятие цикла :) А то будете тут ни о чём разговаривать.

Полностью согласен)) Вопрос терминологии обсуждать можно долго )

Маэстро 04.08.2010 14:47

А давайте поспорим! Я считаю, что inGray вполне может назвать им написанное ЦИКЛОМ. Кто против? Те кто не видят там for или while??
Ну и что? Цикл - это некое повторяющееся действие... то есть циклически. В этом действии производится проверка УСЛОВИЯ. if () есть? -есть! Что вы придрались? Человеку надо задачу решить, а не придумать название своему скрипту.

Маэстро 04.08.2010 14:53

Цитата:

Сообщение от Kolyaj (Сообщение 66210)
inGray,
то, что браузер зависнет, вас не смущает?

Объясните, почему броузер должен зависнуть? При использовании setTimeout() ничего не зависнет.

Octane 04.08.2010 14:58

Цитата:

Сообщение от Маэстро
Объясните, почему броузер должен зависнуть?

Попробовать трудно?
while(1);

Маэстро 04.08.2010 14:59

Цитата:

Сообщение от subzey (Сообщение 66215)
...код с таймаутом запустится только тогда, когда пройдет нужное время и никакой код не будет выполняться.

Что за ..........?
Это код ВНУТРИ setTimeout('ABCD()', xxx) не будет выполняться, пока не пройдёт заданное время ххх, т.е. не будет выполняться функция ABCD(). А код, следующий за строкой setTimeout(...), будет выполняться сразу! Вот с этой проблемой и обратился автор поста.

Маэстро 04.08.2010 15:01

Цитата:

Сообщение от Octane (Сообщение 66248)
Попробовать трудно?
while(1);

Не буду это я пробовать! Где в Вашем цикле используется setTimeout()?

Kolyaj 04.08.2010 15:02

Цитата:

Сообщение от Маэстро
Объясните, почему броузер должен зависнуть?

А почему он не должен зависнуть? В вечном цикле он будет что-то делать, выполняется всё в одном потоке, поэтому браузер больше ни на что не отвечает.

Цитата:

Сообщение от Маэстро
А код, следующий за строкой setTimeout(...), будет выполняться сразу! Вот с этой проблемой и обратился автор поста.

В JavaScript такой код невозможен.

Kolyaj 04.08.2010 15:03

Цитата:

Сообщение от Маэстро
Не буду это я пробовать! Где в Вашем цикле используется setTimeout()?

А кто говорил, что при setTimeout что-то виснет?

Octane 04.08.2010 15:03

Маэстро, читайте внимательнее, речи про setTimeout не было:
Цитата:

Сообщение от inGray
Любую задержку можно реализовать циклами.. конечными или бесконечными. В том числе и ожидание семафора.

Цитата:

Сообщение от Kolyaj
inGray,
то, что браузер зависнет, вас не смущает?

Цитата:

Сообщение от Маэстро
Цитата:

Сообщение от Kolyaj (Сообщение 66210)
inGray,
то, что браузер зависнет, вас не смущает?

Объясните, почему броузер должен зависнуть?


inGray 04.08.2010 15:08

К чему весь этот спор? При реализации циклов через while или for дальнейшие операции не выполняются ожидая завершения цикла - получаем аналог команды sleep (Часть вопроса автора топика). Если цикл писать через setTimeout() другие функции продолжают выполнятся. И браузер будет отвечать на команды пользователя.

Gvozd 04.08.2010 15:09

Маэстро,
благодаря вам и таким людям как inGray появилось понятие "быдлокодер"
Цитата:

Сообщение от Маэстро
Человеку надо задачу решить, а не придумать название своему скрипту.

inGray сам придумал "название" своему скрипту
да, скрипт применительно к данной ситуации рабочий(о чем я уже сказал), но называть его циклом неправомерно

Kolyaj 04.08.2010 15:10

Цитата:

Сообщение от inGray
получаем аналог команды sleep

Это не аналог sleep.

Цитата:

Сообщение от inGray
Если цикл писать через setTimeout() другие функции продолжают выполнятся.

Если писать через setTimeout, то дальнейшие операции не будут дожидаться окончания "цикла".

Маэстро 04.08.2010 15:42

Цитата:

Сообщение от Gvozd (Сообщение 66255)
Маэстро,
благодаря вам и таким людям как inGray появилось понятие "быдлокодер"

"быдлокодер" говорите... чтож... у меня пропало желание обсуждать с Вами что-либо.

Маэстро 04.08.2010 15:48

Цитата:

Сообщение от Kolyaj (Сообщение 66256)
Если писать через setTimeout, то дальнейшие операции не будут дожидаться окончания "цикла".

Я и говорю, что дальнейшие операции не будут ждать окончания цикла. Это цикл "должен дожидаться" чего-то (проверять условие) и по условию запускать следующее действие. Вот это действие и будет условно говоря ждать окончание цикла.
Показываю:
http://gigalit.com.ua/test/test2.htm

<div id="test" style="position:absolute; left:10px; top:80px; width:100px; height:100px; background-color:#8888FF"> </div>
<iframe id="frame1" name="frame1" style="position:absolute; left:0px; top:200px; width:100%; height:300px;"></iframe>
<a target="frame1" href=http://javascript.ru>qwerty</a><br>
<a target="frame1" href=http://ukr.net>zxcvbn</a>
<script type="text/javascript">
var xxx = 0;
function mama()
{
var o = document.getElementById('test');

xxx = xxx + 50;
if (xxx > 500)  xxx = 0;

o.style.left = xxx;
}

setInterval('mama()',500);
</script>

Маэстро 04.08.2010 16:43

Цитата:

Сообщение от Kolyaj (Сообщение 66251)
А почему он не должен зависнуть? В вечном цикле он будет что-то делать, выполняется всё в одном потоке, поэтому браузер больше ни на что не отвечает.
В JavaScript такой код невозможен.

Вот Вам вечный цикл http://gigalit.com.ua/test/test2.htm
-при этом броузер продолжает работать (воспринимает клики по ссылкам)

Kolyaj 04.08.2010 16:54

Цитата:

Сообщение от Маэстро
Вот Вам вечный цикл http://gigalit.com.ua/test/test2.htm

В общепринятом понимании это не цикл. Хотите называть это циклом -- пожалуйста, но предупреждайте всех заранее, что вы понимаете под словом цикл. Сообщение, которое вы пытаетесь опровергнуть, писалось про обычные циклы for/while/do-while.

inGray 04.08.2010 17:05

Цикл - это повторяющийся набор команд, разве нет?

Kolyaj 04.08.2010 17:12

Цитата:

Сообщение от inGray
Цикл - это повторяющийся набор команд, разве нет?

Я понял, что вы хотели сказать, но плохо выразились. Повторяющийся набор команд вот
f();
f();
f();
f();

Это не цикл.

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

inGray 04.08.2010 17:19

Нет.. это не рекурсия... И не цикл) Пусть так) Что это тогда? Условный переход goto на метку? )

Маэстро 04.08.2010 17:50

Цитата:

Сообщение от Kolyaj (Сообщение 66284)
В общепринятом понимании это не цикл. Хотите называть это циклом -- пожалуйста, но предупреждайте всех заранее, что вы понимаете под словом цикл.

Да ёлы-палы! Кроме собственного "Я" есть ещё какие-то авторитеты?
Под циклом понимается периодическое повторение чего-то одинакового...
Привожу цитату из авторитетного источника:
Цикл — разновидность управляющей конструкции в высокоуровневых языках программирования, предназначенная для организации многократного исполнения набора инструкций. Также циклом может называться любая многократно исполняемая последовательность инструкций, организованная любым способом (например, с помощью условного перехода).

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

setInterval('mama()',500); - это тоже цикл. но без while.

Kolyaj 04.08.2010 17:57

Маэстро,
рекурсия тоже цикл?

Маэстро 04.08.2010 18:12

Цитата:

Сообщение от Kolyaj (Сообщение 66296)
Маэстро,
рекурсия тоже цикл?

Рекурсию лично я циклом не считаю. Но что меняет моё мнение? Не хочу спорить и не буду.
Автор поста написал:
"...нельзя сделать паузу. Как тогда поступать в таких случаях?"
Ему предложили методы/способы решения. А как они называются - ему всё-равно... хоть "розовые слоники".


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