05.02.2013, 13:59
|
Новичок на форуме
|
|
Регистрация: 01.02.2013
Сообщений: 9
|
|
.then(function(res){},function(err){}) + дополнительная переменная.
Снова прошу помощи.
Проблема в незнании альтернатив или не понимании метода.
Суть проблемы передать внутрь then(function(res) {},finction(err){});
переменные, например мне нужно передать k внутрь then функции.
Действия, которые я произвожу внутри функции в then, работают. Но если я обращаюсь к какой-либо переменной за пределами функции, которая естественно лежит за пределами области видимости, то получаю ошибки. Но как наравить дополнительные переменные, кроме res, внутрь функции я не знаю.
for ( var k in blablabla) {
var order = ...
order.then(function(res) {
console.log('k=' + k);
console.log('res=' + res);
}, function(err) {
});
}
Последний раз редактировалось megagramm, 05.02.2013 в 14:12.
|
|
05.02.2013, 14:36
|
Новичок на форуме
|
|
Регистрация: 01.02.2013
Сообщений: 9
|
|
Может быть кто-то предложит другой вариант, как поступить?
|
|
05.02.2013, 14:41
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
// имитация
Dzen = function() {};
Dzen.prototype.then = function(f) {
f.call(this, 'resvalue');
}
console = console || {};
console.log = alert.bind(window);
var blablabla = {a:'a', b:'b'};
for ( var k in blablabla) {
var order = new Dzen();
order.then(function(res) {
console.log('k=' + k);
console.log('res=' + res);
}, function(err) {
});
}
а что за then ?
|
|
05.02.2013, 15:16
|
Новичок на форуме
|
|
Регистрация: 01.02.2013
Сообщений: 9
|
|
Спасибо за ответ. Пока пытаюсь понять как мне это в моем случае использовать. Много непонятных мне действий bind, prototype,call и || - вне if(). Есть с чем разбираться.
Сообщение от danik.js
|
а что за then ?
|
Не совсем понял вопрос. Рабтаю с yandex.maps api. Но вроде бы then - это не их метод, а jquery.
Думаю лучше мне будет привести пример. почикал все лишнее, чтобы не отвлекало.
function loadCourierHomeAddressPoints(ymaps) {
for ( var k in courier) {
// это геокодирвание в яндекскартах. получаю координаты.
var myGeocoder = ymaps.geocode(courier[k].address, {
results : 1,
boundedBy : cityBound,
strictBounds : true
});
// обрабатываем результаты, подготавливаем данные метки, создаем метрку.
myGeocoder.then(function(res) {
console.log('k=' + k);
var courierHomeAddressPlacemarkContentLayot = ymaps.templateLayoutFactory.createClass('<div>'
+ '<div style="color:red;background-color:rgba(255,255,255,0.7);">$[properties.courier], $[properties.name], $[properties.address]</div>'
+ '');
var properties = {
courier : k,
name : courier[k].name,
address : courier[k].address
};
var options = {
iconLayout : "default#imageWithContent",
iconContentLayout : courierHomeAddressPlacemarkContentLayot,
cursor : 'grab',
hasBalloon : false,
iconContentOffset : [ 0, -10 ], // смещение содержимого метки
iconImageHref : '../tpl/img/points/pm' + colors[k].colorLabel + 'm.png',// метка курьера
};
// collectionCourierHomeAddress.add(res.geoObjects);
coordinates = res.geoObjects.get(0).geometry.getCoordinates();// результат геокодирования - координаты
courierHomeAddressPoint[k] = new ymaps.Placemark(coordinates, properties, options); // создаю метку
}, function(err) {
});
}
}
Как видите я использую содержимое хеша courier. Но для того чтобы добраться до содержимого, мне необходимо оперировать k внутри функции. А для оптимизации еще и переменную шаблона вынести за пределы, чтобы не создавать ее всякий раз.
Последний раз редактировалось megagramm, 05.02.2013 в 15:18.
|
|
05.02.2013, 15:36
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Сообщение от megagramm
|
Пока пытаюсь понять как мне это в моем случае использовать
|
Да никак. Это все я добавил для обеспечения работы твоего кода. Мой пример показывает что все в порядке с областью видимости. Проблема походу в том, что метод then выполняет переданную агрументом функцию асинхронно, с задержкой (а название метода на это и намекает). Когда значение k уже сто раз поменялось и имеет последнее присвоенное значение.
Сообщение от megagramm
|
Но вроде бы then - это не их метод, а jquery
|
А причем тут jquery вообще
Можно делать "снапшоты" значений k таким образом:
function loadCourierHomeAddressPoints(ymaps) {
for ( var k in courier) {
// это геокодирвание в яндекскартах. получаю координаты.
var myGeocoder = ymaps.geocode(courier[k].address, {
results : 1,
boundedBy : cityBound,
strictBounds : true
});
// обрабатываем результаты, подготавливаем данные метки, создаем метрку.
myGeocoder.then((function(k){ return function(res) {
console.log('k=' + k);
var courierHomeAddressPlacemarkContentLayot = ymaps.templateLayoutFactory.createClass('<div>'
+ '<div style="color:red;background-color:rgba(255,255,255,0.7);">$[properties.courier], $[properties.name], $[properties.address]</div>'
+ '');
var properties = {
courier : k,
name : courier[k].name,
address : courier[k].address
};
var options = {
iconLayout : "default#imageWithContent",
iconContentLayout : courierHomeAddressPlacemarkContentLayot,
cursor : 'grab',
hasBalloon : false,
iconContentOffset : [ 0, -10 ], // смещение содержимого метки
iconImageHref : '../tpl/img/points/pm' + colors[k].colorLabel + 'm.png',// метка курьера
};
// collectionCourierHomeAddress.add(res.geoObjects);
coordinates = res.geoObjects.get(0).geometry.getCoordinates();// результат геокодирования - координаты
courierHomeAddressPoint[k] = new ymaps.Placemark(coordinates, properties, options); // создаю метку
})(k), function(err) {
});
}
}
|
|
05.02.2013, 15:37
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Кстати, в таких случаях очень помогает javascript-отладчик, встроенный в браузер.
|
|
05.02.2013, 15:58
|
Новичок на форуме
|
|
Регистрация: 01.02.2013
Сообщений: 9
|
|
Сообщение от danik.js
|
Кстати, в таких случаях очень помогает javascript-отладчик, встроенный в браузер.
|
Спасибо за совет. Да, я пользуюсь web inspector встроенный в хром. Не целиком, но дерево и консоль использую. До осовения остальных элементов как-то не дошло еще.
|
|
05.02.2013, 16:01
|
Новичок на форуме
|
|
Регистрация: 01.02.2013
Сообщений: 9
|
|
Сообщение от danik.js
|
Проблема походу в том, что метод then выполняет переданную агрументом функцию асинхронно,
|
Точно. Так скорее всего и есть. А я то думаю, чего у меня внутри функции k появляется, но всегда с последним значением. Думал где-то раньше в приложении ошибку допустил.
Спасибо что помогли разобраться с сутью проблемы. Буду думать как эти данные вывести вообще без метода then.
|
|
06.02.2013, 00:19
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Так а что по поводу моего кода? Я же предложил решение. Не работает?
Вкладка Sources, выбираем файл, ставим на линейке точку останова в интересующем месте. В момент паузы справа изучаем Scope Variables. Цепочку вызовов функций можно увидеть в Call Stack. При наведении на переменную появится пузырек с ее значением. Полезно иногда еще пошагово выполнять код.
|
|
|
|