Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   setTimeout как он работает??? (https://javascript.ru/forum/misc/14716-settimeout-kak-rabotaet.html)

namo86 27.01.2011 18:50

setTimeout как он работает???
 
Есть у меня задачка одна, вывести большой объем данных на карте, очень большой, от 10 000 объектов, так вот сначала сделал все просто тупо в цикле, но потом понял, что это очень трудно для проца, во время выполнения цикла браузер благополучно зависал секунд на 10. Для борьбы с этой проблемой решил использовать функцию setTimeout с минимальной задержкой, все в общемто получилось, но чтото терзают меня смутные сомнения, всеже setTimeout асинхронная функция, поэтому возник вопрос, а не может ли одна и таже функция запуститься одновременно?

В это случае это может нарушить структуру данных, учитывая что счетчик текущей операции увеличивается внутри функции выполнения progressCurent++;

namo86 27.01.2011 19:23

не до конца описал условия, сама функция выглядит примерно так:

var progressCurent = 0, arrayList = [];
			
var func = function() 
{
	if( arrayList[progressCurent] )
	{
		// logic ... 
		
		progressCurent++;
		
		setTimeout(func, 10);
	}
}

setTimeout(func, 10);

Sweet 27.01.2011 19:55

Цитата:

Сообщение от namo86
не может ли одна и таже функция запуститься одновременно

Нет, такого в javascript быть не может

dmitriymar 27.01.2011 20:52

Цитата:

Сообщение от namo86
всеже setTimeout асинхронная функция, поэтому возник вопрос, а не может ли одна и таже функция запуститься одновременно?

но ты не можешь предсказать их последовательность запуска -если ещё извне будет запускаться не один раз -будет зависеть от производительности отдельно взятого компа

Sweet 27.01.2011 21:35

Цитата:

Сообщение от dmitriymar
но ты не можешь предсказать их последовательность запуска -если ещё из вне будет запускаться не один раз -будет зависеть от производительности отдельно взятого компа

Это ж надо было так не по-русски написать...

dmitriymar 27.01.2011 21:37

Цитата:

Сообщение от Sweet
Это ж надо было так не по-русски написать...

зато понятно

namo86 28.01.2011 16:03

Цитата:

но ты не можешь предсказать их последовательность запуска
В этом и вопрос, в принципе, установка нового события setTimeout происходит только в конце выполнения текущего события, так что пересечений быть не должно, но малоли чего :) поэтому и спросил :)

Мне кажется гораздо больше шансов у подобного бага при использовании функции setInterval нежели setTimeout ...

Kolyaj 28.01.2011 16:06

В вашем коде всё нормально, кроме того, что он будет выполнятся очень медленно. В IE, например, минимально возможная задержка для setTimeout -- 15 мс, в Fx -- 11 мс, в остальных браузерах получше дела обстоят.

namo86 28.01.2011 18:07

Цитата:

Сообщение от Kolyaj (Сообщение 90230)
В вашем коде всё нормально, кроме того, что он будет выполнятся очень медленно. В IE, например, минимально возможная задержка для setTimeout -- 15 мс, в Fx -- 11 мс, в остальных браузерах получше дела обстоят.

Chrome: затрачено времени 18894 мс.
Opera: затрачено времени 21887 мс.
Firefox: затрачено времени 30952 мс.
IE: затрачено времени 94647 мс.

Дауж ... и это только 1541 объект, ну как вариант можно увеличить количество операций в одном событии, в данный момент, одно событие одна операция, но все же это лучше чем полностью подвешивать браузер на 10-20 сек на i5, боюсь себе представить что твориться на машинках послабее.

x-yuri 28.01.2011 20:16

namo86, начать стоит с того, зачем столько объектов на карте? Может их можно не все сразу выводить? Расскажи поподробнее


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