.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) { }); } |
Может быть кто-то предложит другой вариант, как поступить?
|
// имитация 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 ? |
Спасибо за ответ. Пока пытаюсь понять как мне это в моем случае использовать. Много непонятных мне действий bind, prototype,call и || - вне if(). Есть с чем разбираться.
Цитата:
Думаю лучше мне будет привести пример. почикал все лишнее, чтобы не отвлекало. 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 внутри функции. А для оптимизации еще и переменную шаблона вынести за пределы, чтобы не создавать ее всякий раз. |
Цитата:
Цитата:
Можно делать "снапшоты" значений 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) { }); } } |
Кстати, в таких случаях очень помогает javascript-отладчик, встроенный в браузер.
|
Цитата:
|
Цитата:
Спасибо что помогли разобраться с сутью проблемы. Буду думать как эти данные вывести вообще без метода then. |
Так а что по поводу моего кода? Я же предложил решение. Не работает?
Вкладка Sources, выбираем файл, ставим на линейке точку останова в интересующем месте. В момент паузы справа изучаем Scope Variables. Цепочку вызовов функций можно увидеть в Call Stack. При наведении на переменную появится пузырек с ее значением. Полезно иногда еще пошагово выполнять код. |
Часовой пояс GMT +3, время: 10:51. |