27.01.2011, 18:50
|
Интересующийся
|
|
Регистрация: 18.11.2010
Сообщений: 19
|
|
setTimeout как он работает???
Есть у меня задачка одна, вывести большой объем данных на карте, очень большой, от 10 000 объектов, так вот сначала сделал все просто тупо в цикле, но потом понял, что это очень трудно для проца, во время выполнения цикла браузер благополучно зависал секунд на 10. Для борьбы с этой проблемой решил использовать функцию setTimeout с минимальной задержкой, все в общемто получилось, но чтото терзают меня смутные сомнения, всеже setTimeout асинхронная функция, поэтому возник вопрос, а не может ли одна и таже функция запуститься одновременно?
В это случае это может нарушить структуру данных, учитывая что счетчик текущей операции увеличивается внутри функции выполнения progressCurent++;
|
|
27.01.2011, 19:23
|
Интересующийся
|
|
Регистрация: 18.11.2010
Сообщений: 19
|
|
не до конца описал условия, сама функция выглядит примерно так:
var progressCurent = 0, arrayList = [];
var func = function()
{
if( arrayList[progressCurent] )
{
// logic ...
progressCurent++;
setTimeout(func, 10);
}
}
setTimeout(func, 10);
|
|
27.01.2011, 19:55
|
Профессор
|
|
Регистрация: 16.03.2010
Сообщений: 1,618
|
|
Сообщение от namo86
|
не может ли одна и таже функция запуститься одновременно
|
Нет, такого в javascript быть не может
|
|
27.01.2011, 20:52
|
х.з
|
|
Регистрация: 21.11.2010
Сообщений: 4,588
|
|
Сообщение от namo86
|
всеже setTimeout асинхронная функция, поэтому возник вопрос, а не может ли одна и таже функция запуститься одновременно?
|
но ты не можешь предсказать их последовательность запуска -если ещё извне будет запускаться не один раз -будет зависеть от производительности отдельно взятого компа
Последний раз редактировалось dmitriymar, 27.01.2011 в 21:38.
|
|
27.01.2011, 21:35
|
Профессор
|
|
Регистрация: 16.03.2010
Сообщений: 1,618
|
|
Сообщение от dmitriymar
|
но ты не можешь предсказать их последовательность запуска -если ещё из вне будет запускаться не один раз -будет зависеть от производительности отдельно взятого компа
|
Это ж надо было так не по-русски написать...
|
|
27.01.2011, 21:37
|
х.з
|
|
Регистрация: 21.11.2010
Сообщений: 4,588
|
|
Сообщение от Sweet
|
Это ж надо было так не по-русски написать...
|
зато понятно
|
|
28.01.2011, 16:03
|
Интересующийся
|
|
Регистрация: 18.11.2010
Сообщений: 19
|
|
Цитата:
|
но ты не можешь предсказать их последовательность запуска
|
В этом и вопрос, в принципе, установка нового события setTimeout происходит только в конце выполнения текущего события, так что пересечений быть не должно, но малоли чего поэтому и спросил
Мне кажется гораздо больше шансов у подобного бага при использовании функции setInterval нежели setTimeout ...
|
|
28.01.2011, 16:06
|
Новичок на форуме
|
|
Регистрация: 19.02.2008
Сообщений: 9,177
|
|
В вашем коде всё нормально, кроме того, что он будет выполнятся очень медленно. В IE, например, минимально возможная задержка для setTimeout -- 15 мс, в Fx -- 11 мс, в остальных браузерах получше дела обстоят.
|
|
28.01.2011, 18:07
|
Интересующийся
|
|
Регистрация: 18.11.2010
Сообщений: 19
|
|
Сообщение от Kolyaj
|
В вашем коде всё нормально, кроме того, что он будет выполнятся очень медленно. В IE, например, минимально возможная задержка для setTimeout -- 15 мс, в Fx -- 11 мс, в остальных браузерах получше дела обстоят.
|
Chrome: затрачено времени 18894 мс.
Opera: затрачено времени 21887 мс.
Firefox: затрачено времени 30952 мс.
IE: затрачено времени 94647 мс.
Дауж ... и это только 1541 объект, ну как вариант можно увеличить количество операций в одном событии, в данный момент, одно событие одна операция, но все же это лучше чем полностью подвешивать браузер на 10-20 сек на i5, боюсь себе представить что твориться на машинках послабее.
|
|
28.01.2011, 20:16
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
namo86, начать стоит с того, зачем столько объектов на карте? Может их можно не все сразу выводить? Расскажи поподробнее
|
|
|
|