Будем хранить URL и количества объектов в виде следующей конструкции:
Код: Выделить всё
var fs = [
{ 'url': 'url_1', 'feature_count': 0 },
{ 'url': 'url_2', 'feature_count': 0 }
];
Как поступить дальше? На первый взгляд решение тривиальное: пробежаться в цикле по всем URL, и заполнить свойства feature_count:
Код: Выделить всё
var geojson = new OpenLayers.Format.GeoJSON();
for (var i=0; i<fs.length; i+=1) {
OpenLayers.Request.GET({
url: fs.url,
success: function(request) {
var features = geojson.read(request.responseText);
fs.feature_count = features.length;
}
});
}
Однако данный вариант не сработает. При вызове callback-а success функция OpenLayers.Request.GET уже отработала и значение i будет равно последнему значению i, полученному из счётчика цикла, то есть 2. Поэтому при обращении у fs[2] - возникнет ошибка, так как в массиве fs элемента с таким индексом не существует.
Правильное решение
Правильным решением является не использовать анонимную функцию, а задать её явно и для передачи в неё индекса массива использовать свойство scope (контекст вызова) объекта OpenLayers.Request:
Код: Выделить всё
var geojson = new OpenLayers.Format.GeoJSON();
function feature_count(request) {
var features = geojson.read(request.responseText);
fs[this.index].count = features.length;
}
for (var i=0; i<fs.length; i+=1) {
OpenLayers.Request.GET({
url: fs.url,
success: feature_count,
scope: {'index': i}
});
}
Как видно из примера, объект scope доступен внутри callback-a feature_count как this.