11.11.2012, 18:17
|
Интересующийся
|
|
Регистрация: 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.
|
|
11.11.2012, 18:37
|
х.з
|
|
Регистрация: 21.11.2010
Сообщений: 4,588
|
|
объявить её не в функции
|
|
11.11.2012, 20:03
|
Интересующийся
|
|
Регистрация: 11.11.2012
Сообщений: 22
|
|
К сожалению это ничего не даст, она остается пустой. Получается, что сначала выполняется цикл .each, а потом ф-я form_row. А все, что происходит внутри функции недоступно за ее пределами
Последний раз редактировалось beebop, 11.11.2012 в 20:06.
|
|
11.11.2012, 21:22
|
х.з
|
|
Регистрация: 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.
|
|
11.11.2012, 21:46
|
Интересующийся
|
|
Регистрация: 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
|
|
11.11.2012, 21:47
|
Интересующийся
|
|
Регистрация: 11.11.2012
Сообщений: 22
|
|
То есть сначала выполнится все, что есть в цикле, кроме функции, соответственно переменная будет пустая, где ее ни объявляй. А потом выполняется функция. Столько же раз, сколько выполнялся цикл, но в произвольном порядке
|
|
12.11.2012, 00:08
|
х.з
|
|
Регистрация: 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.
|
|
12.11.2012, 00:12
|
Интересующийся
|
|
Регистрация: 11.11.2012
Сообщений: 22
|
|
И как быть?
|
|
12.11.2012, 00:34
|
х.з
|
|
Регистрация: 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.
|
|
12.11.2012, 09:33
|
Интересующийся
|
|
Регистрация: 11.11.2012
Сообщений: 22
|
|
Если я правильно понимаю, то ничего в callback передавать нельзя, там есть один параметр, доступный по умолчанию, и в качестве callback указывается не функция ( form_row() ), а имя функции ( form_row ). Получается, что счетчик туда передать нельзя. А если все-таки передать, то переменная data будет undefined.
Timeout тоже не спасает.
А как сделать запрос синхронным я не представляю
Последний раз редактировалось beebop, 12.11.2012 в 09:35.
|
|
|
|