setTimeout как он работает???
Есть у меня задачка одна, вывести большой объем данных на карте, очень большой, от 10 000 объектов, так вот сначала сделал все просто тупо в цикле, но потом понял, что это очень трудно для проца, во время выполнения цикла браузер благополучно зависал секунд на 10. Для борьбы с этой проблемой решил использовать функцию setTimeout с минимальной задержкой, все в общемто получилось, но чтото терзают меня смутные сомнения, всеже setTimeout асинхронная функция, поэтому возник вопрос, а не может ли одна и таже функция запуститься одновременно?
В это случае это может нарушить структуру данных, учитывая что счетчик текущей операции увеличивается внутри функции выполнения progressCurent++; |
не до конца описал условия, сама функция выглядит примерно так:
var progressCurent = 0, arrayList = []; var func = function() { if( arrayList[progressCurent] ) { // logic ... progressCurent++; setTimeout(func, 10); } } setTimeout(func, 10); |
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
Мне кажется гораздо больше шансов у подобного бага при использовании функции setInterval нежели setTimeout ... |
В вашем коде всё нормально, кроме того, что он будет выполнятся очень медленно. В IE, например, минимально возможная задержка для setTimeout -- 15 мс, в Fx -- 11 мс, в остальных браузерах получше дела обстоят.
|
Цитата:
Opera: затрачено времени 21887 мс. Firefox: затрачено времени 30952 мс. IE: затрачено времени 94647 мс. Дауж ... и это только 1541 объект, ну как вариант можно увеличить количество операций в одном событии, в данный момент, одно событие одна операция, но все же это лучше чем полностью подвешивать браузер на 10-20 сек на i5, боюсь себе представить что твориться на машинках послабее. |
namo86, начать стоит с того, зачем столько объектов на карте? Может их можно не все сразу выводить? Расскажи поподробнее
|
Цитата:
var point = new google.maps.LatLng ( _this.trackData.points[progressCurent].gps.lat, _this.trackData.points[progressCurent].gps.lng ); if( !_this.hasOwnProperty('googleMapTrackPath') ) { _this.googleMapTrack = new google.maps.Polyline ({ strokeColor: '#2a72a8', strokeOpacity: 0.5, strokeWeight: 5, map: _this.googleMap }); _this.googleMapTrackPath = _this.googleMapTrack.getPath(); } _this.googleMapTrackPath.push(point) Как уже писал, если не использовать setTimeout, при выводе браузер просто зависает, невозможно понять, работает он или висит и сколько он ещё будет грузиться. С помощью setTimeout проблема полностью решается, единственный нюанс это время загрузки, но и это думаю не такая уж большая проблема, самый оптимальный вариант как мне видится, увеличить количество обрабатываемых точек за один выполнение функции setTimeout, можно даже подумать насчет автобалансировщика нагрузки, с помощью пресловутой функции (new Date()).getTime(); и в случае быстрого выполнения одного цикла, добавлять максимальное количество обрабатываемых точек. Кстати если есть материалы по этому поводу, былобы любопытно почитать. |
Цитата:
Это что, зависит от конкретной машины? |
person,
что значит видит? |
Ты говоришь меньше 15 не понимает, а я говорю у меня понимает.
10 и 11 это разное время, а всё что меньше 10, уже одинаково и всегда равняется 10. |
Цитата:
|
person, еще раз, ответ на вопрос "что значит видит?" не прозвучал. Например, один из вариантов определения такой:
var i = 0, d = new Date(), N = 1000; (function() { if (i < N) { i++; setTimeout(arguments.callee, 1); } else { alert((new Date() - d) / N); } })(); а ты как определяешь? |
хотя результаты у меня примерно такие: opera - 1, chrome - 4, ff - 10, ie6 - 10 (а сначала -4 выдал :lol:)
по поводу анимации в фреймворках: jQuery и mootools используют setInterval для анимации, причем первый с шагом 13ms, а второй где-то 16ms (60 fps) |
Часовой пояс GMT +3, время: 20:00. |