Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.11.2012, 18:17
Интересующийся
Отправить личное сообщение для beebop Посмотреть профиль Найти все сообщения от beebop
 
Регистрация: 11.11.2012
Сообщений: 22

scope, области видимости
$(document).ready(function() {
						queue_row_template = $("#queue_row_template").html();
						var queue_content = $.parseJSON('<?echo $json_queue;?>');
						
						var sex, vk_av;
						var table_queue = [];

						$.each(queue_content, function(index, obj){
							var uid = parseInt((/\d+/).exec(obj.S_VKID));
							

								VK.Api.call('users.get', {uids: uid, fields: 'sex, photo'}, form_row);

								function form_row(data) {
									console.log(index); // выводится 0 3 4 2 5 6 1 7 8 10 11 9 12 13 15 14 17 18 16 19 20 21 22 
							        if(data.response) {
										
										sex = data.response[0].sex;
										vk_av = '<a href="http://vk.com/'+obj.S_VKID+'"><img src='+data.response[0].photo+'></a>';
										vk_link = 'href="http://vk.com/'+obj.S_VKID+'"';
							        }
							        else{
							        	sex = 0;
										vk_av = '<img src="/images/no_av.png" alt="">';
										vk_link = '';
							        }

								    var will_be = (sex == 1) ? "будет поздравлена" : "будет поздравлен";

									var queue_row = queue_row_template.replace( /{{vk_av}}/ig, vk_av)
																.replace( /{{date}}/ig, obj.f_date[1])
																.replace( /{{in_impl}}/ig, obj.f_date[0])
																.replace( /{{will_be}}/ig, will_be )
																.replace( /{{vk_id}}/ig, "http://vk.com/"+obj.S_VKID )
																.replace( /{{vk_link}}/ig, vk_link )
																.replace( /{{name}}/ig, obj.S_NAME )
																.replace( /{{sms_id}}/ig, obj.S_ID )
																.replace( /{{sms_text}}/ig, obj.S_TEXT )
																;
									
									$("#sent_queue table").append(queue_row);
							    }
						}); // $.each
					}); // $(document).ready


есть шаблон, есть данные из базы, переведенные в json. Нужно из них сделать таблицу. Она делается, но выводятся строки в произвольном порядке. .append внутри цикла тоже нехорошо. Как за пределами функции form_row получить переменную queue_row? Или какие-то еще варианты решения...

Последний раз редактировалось beebop, 11.11.2012 в 18:21.
Ответить с цитированием
  #2 (permalink)  
Старый 11.11.2012, 18:37
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

объявить её не в функции
Ответить с цитированием
  #3 (permalink)  
Старый 11.11.2012, 20:03
Интересующийся
Отправить личное сообщение для beebop Посмотреть профиль Найти все сообщения от beebop
 
Регистрация: 11.11.2012
Сообщений: 22

К сожалению это ничего не даст, она остается пустой. Получается, что сначала выполняется цикл .each, а потом ф-я form_row. А все, что происходит внутри функции недоступно за ее пределами

Последний раз редактировалось beebop, 11.11.2012 в 20:06.
Ответить с цитированием
  #4 (permalink)  
Старый 11.11.2012, 21:22
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

у переменной объявленной внутри функции -область видимости локальная . если её объявить вне функции у неё будет другая область видимости. сейчас она в замыкании объявлена.объявить её нужно до $(document).ready

(function (){var a =10;})();
alert(typeof a);
alert(a);


var a;
(function (){a =10;})();
alert(typeof a);
alert(a);

Последний раз редактировалось dmitriymar, 11.11.2012 в 21:26.
Ответить с цитированием
  #5 (permalink)  
Старый 11.11.2012, 21:46
Интересующийся
Отправить личное сообщение для beebop Посмотреть профиль Найти все сообщения от beebop
 
Регистрация: 11.11.2012
Сообщений: 22

Я объявил ее вне функции. Даже в цикле у нее type = string. Но значение, присвоенное внутри функции я не могу получить.
Меня беспокоит то, что функция выполняется независимо от цикла.

$.each(queue_content, function(index, obj){
							var uid = parseInt((/\d+/).exec(obj.S_VKID));
							var queue_row = '';
							console.log(index);
							
								VK.Api.call('users.get', {uids: uid, fields: 'sex, photo'}, form_row);
								
								function form_row(data) {
									console.log(index);
							        if(data.response) {


в консоли по идее должно быть 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 и т.д.
а получается:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
0 3 4 2 5 6 1 7 8 10 11 9 12 13 15 14 17 18 16 19 20 21 22
Ответить с цитированием
  #6 (permalink)  
Старый 11.11.2012, 21:47
Интересующийся
Отправить личное сообщение для beebop Посмотреть профиль Найти все сообщения от beebop
 
Регистрация: 11.11.2012
Сообщений: 22

То есть сначала выполнится все, что есть в цикле, кроме функции, соответственно переменная будет пустая, где ее ни объявляй. А потом выполняется функция. Столько же раз, сколько выполнялся цикл, но в произвольном порядке
Ответить с цитированием
  #7 (permalink)  
Старый 12.11.2012, 00:08
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

запрос к контакту асинхронный. цикл не ждёт когда придёт ответ.
index нужно передавать колбеку абстрактно у вас получается такая фишка
(function(){
function a(i){alert(i)};
for (var i=0;i<10;i++){}
a(i); // типа аякс запрос и ответ от контакта
})();


(function(){
function a(i){alert(i)};
for (var i=0;i<10;i++){
setTimeout(function(){a(i)},50); //  типа аякс запрос и ответ через время
}
})();


function a(i){alert(i)};
(function(){
for (var i=0;i<10;i++){
setTimeout(function(){a(i)},50); // типа аякс запрос и ответ через время
}
})();

a должно быть (новый scope)

function a(i){setTimeout(function(){alert(i)},50);// типа аякс ответ
}
(function(){
for (var i=0;i<10;i++){
a(i); // типа аякс запрос к контакту
}
})();


(function(){
function a(i){setTimeout(function(){alert(i)},50);// типа аякс ответ
}
for (var i=0;i<10;i++){
a(i);// типа аякс запрос к контакту
}
})();

(синхронный запрос)
(function(){
function a(){alert(i)};
for (var i=0;i<10;i++){
a(); // типа аякс запрос и ответ от контакта- синхронный
}
})();

Последний раз редактировалось dmitriymar, 12.11.2012 в 01:24.
Ответить с цитированием
  #8 (permalink)  
Старый 12.11.2012, 00:12
Интересующийся
Отправить личное сообщение для beebop Посмотреть профиль Найти все сообщения от beebop
 
Регистрация: 11.11.2012
Сообщений: 22

И как быть?
Ответить с цитированием
  #9 (permalink)  
Старый 12.11.2012, 00:34
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

менять алгоритм передавать индекс в колбек, менять на синхронный запрос если возможно..
самый простой вариант создать новый scope
(function(){
function a(i){alert(i)};
for (var i=0;i<10;i++){
(function(i){
setTimeout(function(){a(i)},50); //  типа аякс запрос и ответ через время
})(i);
}
})();

или
Сообщение от dmitriymar
a должно быть (новый scope)

1 function a(i){setTimeout(function(){alert(i)},50);// типа аякс ответ
2 }
3 (function(){
4 for (var i=0;i<10;i++){
5 a(i); // типа аякс запрос к контакту
6 }
7 })();


1 (function(){
2 function a(i){setTimeout(function(){alert(i)},50);// типа аякс ответ
3 }
4 for (var i=0;i<10;i++){
5 a(i);// типа аякс запрос к контакту
6 }
7 })();

(синхронный запрос)
1 (function(){
2 function a(){alert(i)};
3 for (var i=0;i<10;i++){
4 a(); // типа аякс запрос и ответ от контакта- синхронный
5 }
6 })();

Последний раз редактировалось dmitriymar, 12.11.2012 в 01:24.
Ответить с цитированием
  #10 (permalink)  
Старый 12.11.2012, 09:33
Интересующийся
Отправить личное сообщение для beebop Посмотреть профиль Найти все сообщения от beebop
 
Регистрация: 11.11.2012
Сообщений: 22

Если я правильно понимаю, то ничего в callback передавать нельзя, там есть один параметр, доступный по умолчанию, и в качестве callback указывается не функция ( form_row() ), а имя функции ( form_row ). Получается, что счетчик туда передать нельзя. А если все-таки передать, то переменная data будет undefined.
Timeout тоже не спасает.
А как сделать запрос синхронным я не представляю

Последний раз редактировалось beebop, 12.11.2012 в 09:35.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Области видимости событий Turok Events/DOM/Window 3 14.08.2011 20:26
Непонятки с областью видимости переменной zeleniy Общие вопросы Javascript 7 18.04.2011 16:08
стили Css в зависимости от высоты активной области браузера Vladimir_Kl Javascript под браузер 3 23.03.2011 16:04
Как узнать находится ли DOM элемент в области видимости? phgrey Общие вопросы Javascript 4 22.03.2011 19:05
области видимости элементов zaytsewa jQuery 14 11.01.2011 16:49