Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   setTimeout/setInterval - неожиданное поведение (https://javascript.ru/forum/misc/20782-settimeout-setinterval-neozhidannoe-povedenie.html)

RUVATA 19.08.2011 08:53

Цитата:

Сообщение от float
никто ничего не должен. в том то и дело.

зашибись :) а зачем тогда у функций setTimeout и setInterval второй параметр, которым задается отсрочка или интервал ?
если:
Цитата:

Сообщение от float
функция будет выполняться в неизвестный момент времени.

Для красоты ?
Вот оф.реф для setInterval
Цитата:

Сообщение от float
Calls a function repeatedly, with a fixed time delay between each call to that function.

здесь что-то сказано про неопределенность ?

float 19.08.2011 09:01

var t = Date.now();
var str = '';
for(var i = 0; i<20; i++) {
    str +='afa';
}
alert(Date.now()-t);

float 19.08.2011 09:06

Цитата:

проведите аналогичный эксперимент в NODE.js
тожесамое...

RUVATA 19.08.2011 09:07

и... :)
мне alert-нуло '0'
это вы к чему ?
где тут асинхронность и вообще инструкция в 6-ой строке листинга 'str' это что ?

float 19.08.2011 09:16

Цитата:

и...
к тому, что 0 это приблизительно время выполнения вашей функции, а через интервал у вас только спустя 12 мс вызовется.
Цитата:

и вообще инструкция в 6-ой строке листинга 'str' это что
мусор из консоли завалялся:)

Kolyaj 19.08.2011 09:28

Цитата:

Сообщение от RUVATA
Т.е. по наступлению события или таймера, исполнение текущего контекста приостанавливается, и исполняется контекст назначенный, после чего возобновляется выполнение текущего...

Вы это сами только что придумали или вычитали где? Объясняю на пальцах

setTimeout(foo, 500);
bar();

Допустим функция bar выполняется 2 секунды. Тогда вопреки вашему желанию функция foo выполнится не через пол секунды, а через две, когда освободится поток. В общем случае запись setTimeout(foo, n) означает "запустить функцию foo не раньше чем через n миллисекунд", а не "запустить функцию foo через n миллисекунд".

RUVATA 19.08.2011 10:02

PS: :) кстати по поводу NODE.js я погорячился setTimeout и setInterval работают точно так-же ... виноват... зато callback-и прерывают выполнение как и ожидается
var events = require("events");
var emitter = new events.EventEmitter; // создаём генератор
var someText = '';

// задаём обработчик пользовательского события "event1"
emitter.on("event1", function(data) {
    if(){}
	someText = someText + '-Async-'
});

for(var i = 0; i < 20; i++){
 someText = someText + '-MainThead-';
 emitter.emit("event1");
}

console.log(someText)

...
PPS: Вы безусловно правы ВСЕ... вы описываете реальное положение вещей. НО ЭТО НЕ АСИНХРОННОСТЬ !
Нельзя функцию с отложенным вызовом называть асинхронной. Это просто функция с отложенным вызовом и не более того.
Асинхронно - это не синхронно... то есть код будет выполняться в одном потоке но в смешанном режиме, по крайней мере такова асинхронность в низкоуровневом программировании.
когда выполнение двух функции (func1 и func2) в асинхронном режиме выглядит как-то так:
Выполняется инструкция из func1
Выполняется инструкция из func2
Выполняется инструкция из func1
Выполняется инструкция из func2
Выполняется инструкция из func2
Выполняется инструкция из func1
и т.д.
(правила скрещивания обусловлены платформой, ресурсами под инструкцию и т.д.)
они не паралельны, но и не синхронны... они асинхронны.

Здесь-же мы наблюдаем псевдоасинхронность...

Kolyaj 19.08.2011 10:10

Цитата:

Сообщение от RUVATA
зато callback-и прерывают выполнение как и ожидается

Разумеется, ведь emit синхронный. Откуда там асинхронности взяться?

float 19.08.2011 10:16

Цитата:

они не паралельны, но и не синхронны... они асинхронны.
:haha:
Многозадачность

Kolyaj 19.08.2011 10:39

Давайте по порядку. Асинхронная функция -- такая функция, которая сразу передаёт управление вызвавшему её коду, но продолжает в это время что-то делать и результат своей работы сообщает позже. Разумеется, продолжает что-то делать она в другом потоке, но этот другой поток реализован или на уровне платформы (XMLHttpRequest в браузере), или на уровне ОС (i/o в NodeJS). Сам JavaScript при этом остаётся однопоточным.

В случае использования setTimeout второй поток не нужен. Функция ничего не делает, пока ждёт запуска переданной в setTimeout функции, а ничего не делать можно и в одном потоке :)


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