Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   .then(function(res){},function(err){}) + дополнительная переменная. (https://javascript.ru/forum/jquery/35263-then-function-res-%7B%7D-function-err-%7B%7D-dopolnitelnaya-peremennaya.html)

megagramm 05.02.2013 13:59

.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:36

Может быть кто-то предложит другой вариант, как поступить?

danik.js 05.02.2013 14:41

// имитация
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 ?

megagramm 05.02.2013 15:16

Спасибо за ответ. Пока пытаюсь понять как мне это в моем случае использовать. Много непонятных мне действий 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 внутри функции. А для оптимизации еще и переменную шаблона вынести за пределы, чтобы не создавать ее всякий раз.

danik.js 05.02.2013 15:36

Цитата:

Сообщение от 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) {
        });
    }
}

danik.js 05.02.2013 15:37

Кстати, в таких случаях очень помогает javascript-отладчик, встроенный в браузер.

megagramm 05.02.2013 15:58

Цитата:

Сообщение от danik.js (Сообщение 231771)
Кстати, в таких случаях очень помогает javascript-отладчик, встроенный в браузер.

Спасибо за совет. Да, я пользуюсь web inspector встроенный в хром. Не целиком, но дерево и консоль использую. До осовения остальных элементов как-то не дошло еще.

megagramm 05.02.2013 16:01

Цитата:

Сообщение от danik.js
Проблема походу в том, что метод then выполняет переданную агрументом функцию асинхронно,

Точно. Так скорее всего и есть. А я то думаю, чего у меня внутри функции k появляется, но всегда с последним значением. Думал где-то раньше в приложении ошибку допустил.
Спасибо что помогли разобраться с сутью проблемы. Буду думать как эти данные вывести вообще без метода then.

danik.js 06.02.2013 00:19

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

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


Часовой пояс GMT +3, время: 10:51.