Передача параметров в callback-и OpenLayers.Request
Добавлено: 01 окт 2012, 07:19
Предположим у нас есть некоторый массив, содержащий перечень URL и перед нами стоит задача получить количество объектов, расположенных по каждому из URL из этого списка.
Будем хранить URL и количества объектов в виде следующей конструкции:
Как поступить дальше? На первый взгляд решение тривиальное: пробежаться в цикле по всем URL, и заполнить свойства feature_count:
Однако данный вариант не сработает. При вызове callback-а success функция OpenLayers.Request.GET уже отработала и значение i будет равно последнему значению i, полученному из счётчика цикла, то есть 2. Поэтому при обращении у fs[2] - возникнет ошибка, так как в массиве fs элемента с таким индексом не существует.
Правильное решение
Правильным решением является не использовать анонимную функцию, а задать её явно и для передачи в неё индекса массива использовать свойство scope (контекст вызова) объекта OpenLayers.Request:
Как видно из примера, объект scope доступен внутри callback-a feature_count как this.
Будем хранить 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.