Передача параметров в callback-и OpenLayers.Request

Решенные задачи, первая запись - описание решения.
Ответить
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3366
Зарегистрирован: 11 апр 2008, 21:09
Статьи: 33
Проекты: 9
Репутация: 511
Ваше звание: Author
Контактная информация:

Передача параметров в callback-и OpenLayers.Request

Сообщение Denis Rykov » 01 окт 2012, 07:19

Предположим у нас есть некоторый массив, содержащий перечень URL и перед нами стоит задача получить количество объектов, расположенных по каждому из URL из этого списка.

Будем хранить 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.
Spatial is now, more than ever, just another column- The Geometry Column.

Ответить

Вернуться в «Рецепты»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость