Имеется:
var myLayers=[
{name='Группа A', xmlUrl:'...some_url.xml', active:0},
{name='Группа Б', xmlUrl:'...other_url.xml', active:0},
....
{name='Группа Z', xmlUrl:'...yet_another_url.xml', active:0}
];
(Массив заранее не задан, генерируется отдельно и инклюдится апачем)
В API 1.0 работала конструкция:
for (var i=0; i < myLayers.length; i++) {
myLayers[i].obj=new YMaps.YMapsML(myLayers[i].xmlUrl,{ viewAutoApply: false });
// далее создаем (вне карты) кнопку, включающую-выключающую i-ый слой через
// map.addOverlay(myLayers[i].obj) и map.removeOverlay(myLayers[i].obj)
}
В API 2.0 сходная конструкция -
for (var i=0; i < myLayers.length; i++) {
ymaps.geoXml.load(myLayers[i].xmlUrl).then(functio n(res) {myLayers[i].obj=res;});
// и т.д.
}
- не работает, поскольку geoXML.Load асинхронен. К моменту выполнения then, переменная i успевает принять значение myLayers.length
Что делать?
Можно, конечно, генерить вместе с массивом еще и "наполнитель" вида
ymaps.geoXml.load(myLayers[0].xmlUrl).then(functio n(res) {myLayers[0].obj=res;});
ymaps.geoXml.load(myLayers[1].xmlUrl).then(functio n(res) {myLayers[1].obj=res;});
...
Но это явно не самый удобный путь.
Можно ли передавать в обработчик then дополнительный параметр, определенный на момент создания обработчика?
Или, может быть, можно заставить geoXml.load работать синхронно?