Я не думаю, что «все идет слишком быстро» - это точный диагноз любой проблемы, с которой вы столкнулись.
Одна вещь, которую я вижу, состоит в том, что у вас есть вызовы ajax, инициированные после успеха других вызовов ajax. Я не знаю, является ли библиотека Ajax повторной. Вы можете избежать этого.
Я бы сделал так, чтобы ввести асинхронность в микс. Используйте setTimeout()
для вызова функции processbatch()
. Затем он будет работать асинхронно относительно первого вызова Ajax.
Также рассмотрите возможность использования асинхронности для вызова goecoder. Отправляйте новый запрос геокодера только после выполнения всех других запросов геокодера. То, как вы это делаете, вы отправляете их всех сразу. (Может быть, это то, что вы подразумеваете под «все работает слишком быстро»).
Способ сделать это: принять в ваш address_lookup fn массив адресных объектов и индекс. Вызов геокодера по i-му адресу. Затем, когда вызов завершится (успех или неудача), увеличьте индекс и используйте setTimeout, чтобы снова вызвать address_lookup.
Таким образом, у вас всегда есть не более одного звонка в геокодер.
В коде это выглядит примерно так:
var delay = 140;
function doAllAddresses(a, ix, callback) {
// handle any addresses.
// Test the list index for validity. If valid,
// Do the geocode, then increment the list index,
// and call "myself" to handle additional
// addresses. When no more addresses remain, invoke
// the 'done' callback.
if (ix < a.length) {
invokeGeocoderForOneAddress(a[ix], function() {
// success function - gets invoked only when call to geocoder returns
ix++;
setTimeout(function(){doAllAddresses(ltr, ix, callback);}, delay);
});
return;
}
callback();
}
// kickoff:
doAllAddresses(addresses, 0, function() { alert("all addresses are done.");});
EDIT
PS: Я рекомендую вам исправить ваши имена FN для использования имен CamelCase и verbNoun. Итак, processBatch()
и lookupAddress()
, а не processbatch()
и address_lookup()
.
EDIT
Вот как следует об этом подумать: когда вы вызываете ajax-вызов, вы говорите браузеру отправить HTTP-запрос. Обычно во время вызова вы передаете функцию «success», которая вызывается для вас при получении ответа HTTP. Как вы знаете из браузера, ответ может прийти быстро или не так быстро. Когда вы вызываете ajax-вызовы в цикле, вы говорите браузеру отправлять N одновременных HTTP-запросов. Не обязательно то, что вы хотите.
То, что я предлагаю здесь, - это вызывать по одному вызову AJAX за раз (например, геокодеру) и вызывать только следующий вызов с успехом fn, то есть ПОСЛЕ того, как ответ получен от первого один. Также, если вы сделаете это с помощью setTimeout()
, вы избежите глубокого вложения.