2013-06-01 3 views
0

У меня есть функция, связанная с событиями щелчка мыши на карте Google. Из-за характера функции может потребоваться несколько минут для завершения обработки (.1 сек. - 2 сек. В зависимости от скорости соединения). Само по себе это не большая проблема, однако, если пользователь получает счастливый клик, это может вызвать проблемы, а последующие вызовы немного зависят от предыдущего.Обработка и ожидание завершения предыдущих вызовов JavaScript

Что было бы лучшим способом, чтобы последующие вызовы ожидали завершения предыдущих? Или даже лучший способ справиться с ошибками предыдущих вызовов?

Я смотрел, выполнив следующие действия:

  • Использование пользовательских .addEventListener(Link)
  • Использование цикла в то время как ожидает предыдущий обработал
  • Используя простой, если оператор, который проверяет, если ранее нужно чтобы повторно запустить
  • Использование других форм обратных вызовов

Теперь некоторые примеры кода для контекста:

this.createPath = function(){ 
    //if previous path segment has no length 
    if (pathSegment[this.index-1].getPath().length === 0){ 
     //we need the previous path segment recreated using this same function 
     pathSegment[this.index-1].createPath(); 
     //now we can retry this path segment again 
     this.createPath(); 
    } 
    //all is well, create this path segment using Google Maps direction service 
    else { 
     child.createPathLine(pathSegment[this.index-1].getEndPoint(), this.clickCoords); 
    } 
} 

Естественно этот код, как это будет цикл, как сумасшедшие, и создать много запросов.

ответ

0

Это хороший прецедент для обещаний.

Они работают, как это (пример использования JQuery обещаний, но есть и другие интерфейсы API для обещаний, если вы не хотите использовать JQuery):

function doCallToGoogle() { 
    var defer = $.Deferred(); 

    callToGoogleServicesThatTakesLong({callback: function(data) { 
     defer.resolve(data); 
    }}); 

    return defer.promise(); 
} 

/* ... */ 
var responsePromise = doCallToGoogle(); 

/* later in your code, when you need to wait for the result */ 
responsePromise.done(function (data) { 
    /* do something with the response */ 
}); 

Хорошая вещь, что вы можете Обещания цепи:

var newPathPromise = previousPathPromise.then(
     function (previousPath) { /* build new path */ }); 

Посмотрите:

Резюмируя обещания являются объектом абстракции по сравнению с использованием обратных вызовов, которые очень полезны для управления потоком (выстраивание, ожидая всех обратных вызовов, избежать многих обратных вызовов вложенности).

+0

Thanks Diego! Я изучал эти варианты, они кажутся многообещающими. Однако я не вижу простого способа построить зависимость от завершения предыдущего запроса до следующего запуска. Во второй части вы упомянете о том, что, по-моему, я могу использовать. Из тестирования я сделал это, похоже, вы можете даже пометить. Затем хорошо после того, как обещание разрешилось. Возможно, сделать манекен разрешенным отложить и поставить в очередь, используя. Будет ли это даже иметь смысл? Мне это не кажется очень чистым. –

Смежные вопросы