setTimeout в цикле для проверки изменения границ - PullRequest
2 голосов
/ 06 сентября 2010

Это мой код:

var b;
while(!b){
    setTimeout(function(){
        alert('sss')
        b=1;
    }, 500);
}

и он не будет предупреждать 'sss'

Что я могу сделать?

Обновлен:

Я хочу получить границы на картах Google v3:

function get_bounds(){
            var bounds_;
            while(!bounds_){
                setTimeout(function(){
                    bounds_=map.getBounds();
                    if(bounds_){
                        var leftBottom=[bounds_.getSouthWest().lat(),bounds_.getSouthWest().lng()]
                        var rightTop=[bounds_.getNorthEast().lat(),bounds_.getNorthEast().lng()]
                        return [leftBottom,rightTop];
                        }
                }, 500);
            }
        }

updated2:

привет, Патрик Д.В., я не знаю почему, но ваш код не работает:

var b;
function waitForB() {
    setTimeout(function(){
        if(!b)
            waitForB();
        else
            alert('sss');
    }, 500);
}
waitForB()

updated3:

теперь все в порядке:

var b;
function waitForB() {
    setTimeout(function(){
        if(!b){
            waitForB();
            b='ss';
        }
        else{
            alert('sss')
        }
    }, 500);
}
waitForB()

Ответы [ 4 ]

5 голосов
/ 06 сентября 2010

JavaScript в веб-браузерах запускается в одном потоке.Когда вы вызываете setTimeout(), он не порождает новую тему.Это означает, что setTimeout() не будет выполняться до тех пор, пока не завершится выполнение всего вашего основного кода.

По этой причине у вас будет бесконечный цикл, потому что ваше условие цикла зависит от выполнения setTimeout() callback.

Вот интересная статья о том, как работают таймеры JavaScript:


ОБНОВЛЕНИЕ:

В дополнение к обновленному вопросу вы можете вместо этого прослушать событие bounds_changed.Я не уверен, как вы планируете использовать вашу функцию get_bounds(), но вы можете реорганизовать свою логику, чтобы вместо нее использовать прослушиватель событий:

google.maps.event.addListener(map,'bounds_changed', function () {
   // The code here is triggered when the bounds change
});
1 голос
/ 06 сентября 2010

Этот код будет сжигать процессорное время и память путем планирования времени ожидания.Подумайте об этом: у вас в цикле «б» становится правдой.Как это произойдет?Только когда срабатывает таймер.Это случится?Нет, потому что вы едите всю машину, планируя на миллионы больше тайм-аутов.

Такая ситуация в качестве контрольного признака показывает эффект разогрева комнаты, в которой вы сидите.* Я не знаю, какой эффект вы пытаетесь получить.Почему бы не начать с просто setTimeout() вызова и посмотреть, как это происходит.Может быть, вы могли бы рассказать больше о том, что вы пытаетесь сделать.

0 голосов
/ 21 января 2011

Эту проблему теперь можно правильно решить с помощью idle, а не bounds_changed прослушивателя событий:

google.maps.event.addListener(map, 'idle', function() { 
  updateStuff();
});

Это событие вызывается, когда карта переходит в режим ожидания после панорамирования или масштабирования. http://code.google.com/apis/maps/documentation/javascript/reference.html

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

0 голосов
/ 06 сентября 2010

Может быть, вы захотите использовать setInterval вместо setTimeout.Когда b изменяется, появляется предупреждение.

var b = false;
(function () {
    var intervalId;
    function wait() {
        if (b) {
            clearInterval(intervalId);
            alert('sss');
        }
    }
    intervalId = setInterval(wait, 500);
})();

Это более интуитивно понятно и не слишком мешает глобальным переменным.

СОВЕТ: ставьте точку с запятой после каждого оператора, еслиВы не уверены, где можно пропустить.

...