Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 05.02.2013, 13:59
Новичок на форуме
Отправить личное сообщение для megagramm Посмотреть профиль Найти все сообщения от megagramm
 
Регистрация: 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.
Ответить с цитированием
  #2 (permalink)  
Старый 05.02.2013, 14:36
Новичок на форуме
Отправить личное сообщение для megagramm Посмотреть профиль Найти все сообщения от megagramm
 
Регистрация: 01.02.2013
Сообщений: 9

Может быть кто-то предложит другой вариант, как поступить?
Ответить с цитированием
  #3 (permalink)  
Старый 05.02.2013, 14:41
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 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 ?
Ответить с цитированием
  #4 (permalink)  
Старый 05.02.2013, 15:16
Новичок на форуме
Отправить личное сообщение для megagramm Посмотреть профиль Найти все сообщения от megagramm
 
Регистрация: 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.
Ответить с цитированием
  #5 (permalink)  
Старый 05.02.2013, 15:36
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 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) {
        });
    }
}
Ответить с цитированием
  #6 (permalink)  
Старый 05.02.2013, 15:37
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Кстати, в таких случаях очень помогает javascript-отладчик, встроенный в браузер.
Ответить с цитированием
  #7 (permalink)  
Старый 05.02.2013, 15:58
Новичок на форуме
Отправить личное сообщение для megagramm Посмотреть профиль Найти все сообщения от megagramm
 
Регистрация: 01.02.2013
Сообщений: 9

Сообщение от danik.js Посмотреть сообщение
Кстати, в таких случаях очень помогает javascript-отладчик, встроенный в браузер.
Спасибо за совет. Да, я пользуюсь web inspector встроенный в хром. Не целиком, но дерево и консоль использую. До осовения остальных элементов как-то не дошло еще.
Ответить с цитированием
  #8 (permalink)  
Старый 05.02.2013, 16:01
Новичок на форуме
Отправить личное сообщение для megagramm Посмотреть профиль Найти все сообщения от megagramm
 
Регистрация: 01.02.2013
Сообщений: 9

Сообщение от danik.js
Проблема походу в том, что метод then выполняет переданную агрументом функцию асинхронно,
Точно. Так скорее всего и есть. А я то думаю, чего у меня внутри функции k появляется, но всегда с последним значением. Думал где-то раньше в приложении ошибку допустил.
Спасибо что помогли разобраться с сутью проблемы. Буду думать как эти данные вывести вообще без метода then.
Ответить с цитированием
  #9 (permalink)  
Старый 06.02.2013, 00:19
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Так а что по поводу моего кода? Я же предложил решение. Не работает?

Вкладка Sources, выбираем файл, ставим на линейке точку останова в интересующем месте. В момент паузы справа изучаем Scope Variables. Цепочку вызовов функций можно увидеть в Call Stack. При наведении на переменную появится пузырек с ее значением. Полезно иногда еще пошагово выполнять код.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переменная в ассоциативном массиве. HaseProgram Общие вопросы Javascript 2 05.01.2013 20:36
есть переменная javascript надо передать ее в php как это сделать arahmanov Общие вопросы Javascript 5 08.08.2011 16:26
Переменная после отправки данных lukingnu AJAX и COMET 0 19.03.2011 20:24
Переменная как значение функции. Jurasmi Общие вопросы Javascript 7 22.04.2010 12:45
Строковая переменная как имя объекта MaxLazar Общие вопросы Javascript 4 06.10.2009 00:21