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? Или какие-то еще варианты решения... |
объявить её не в функции
|
К сожалению это ничего не даст, она остается пустой. Получается, что сначала выполняется цикл .each, а потом ф-я form_row. А все, что происходит внутри функции недоступно за ее пределами
|
у переменной объявленной внутри функции -область видимости локальная . если её объявить вне функции у неё будет другая область видимости. сейчас она в замыкании объявлена.объявить её нужно до $(document).ready
(function (){var a =10;})(); alert(typeof a); alert(a); var a; (function (){a =10;})(); alert(typeof a); alert(a); |
Я объявил ее вне функции. Даже в цикле у нее 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 |
То есть сначала выполнится все, что есть в цикле, кроме функции, соответственно переменная будет пустая, где ее ни объявляй. А потом выполняется функция. Столько же раз, сколько выполнялся цикл, но в произвольном порядке
|
запрос к контакту асинхронный. цикл не ждёт когда придёт ответ.
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(); // типа аякс запрос и ответ от контакта- синхронный } })(); |
И как быть?
|
менять алгоритм передавать индекс в колбек, менять на синхронный запрос если возможно..
самый простой вариант создать новый scope (function(){ function a(i){alert(i)}; for (var i=0;i<10;i++){ (function(i){ setTimeout(function(){a(i)},50); // типа аякс запрос и ответ через время })(i); } })(); или Цитата:
|
Если я правильно понимаю, то ничего в callback передавать нельзя, там есть один параметр, доступный по умолчанию, и в качестве callback указывается не функция ( form_row() ), а имя функции ( form_row ). Получается, что счетчик туда передать нельзя. А если все-таки передать, то переменная data будет undefined.
Timeout тоже не спасает. А как сделать запрос синхронным я не представляю |
Часовой пояс GMT +3, время: 17:38. |