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 тоже не спасает. А как сделать запрос синхронным я не представляю |
Цитата:
|
Все бы хорошо, но я не могу передать в callback функцию переменную i.
i все 10 раз будет равно 9 |
beebop,
Зачем передавать в колбек ?передавать нужно в обертку |
Я извиняюсь. Может быть я совсем дурак...
(function(){
function myfunc(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 1 2 5 3 4 6 7 9 10 8 11 12 13 14 16 15 17 18 21 20 19 22 23 26 24 25 27 !!!!!
}
}
for(i=0; i<queue_content.length; i++){
(function(i){
index = i;
obj = queue_content[i];
myfunc(index, obj);
})(i);
}
})();
|
В функцию нужно забрасывать все практически - все что должно существовать в едином отдельном контексте . По русски же сказал что и запрос и колбек и ...
|
ок, смотрите
(function(){
function a(i){
form_row();
function form_row(data) {
setTimeout(function(){console.log(i)},50);// типа аякс ответ 0 1 2 3 4 5 6 7 8 9
}
}
for(var i=0; i<10; i++){
(function(i){
a(i);
})(i);
}
})();
(function(){
function a(i){
VK.Api.call('users.get', {uids: uid}, form_row);
function form_row(data) {
setTimeout(function(){console.log(i)},50);// типа аякс ответ 4 2 3 0 1 6 5 7 8 9
}
}
for(var i=0; i<10; i++){
(function(i){
a(i);
})(i);
}
})();
Ну или если опять что не так, то можно special for dummies? |
| Часовой пояс GMT +3, время: 13:45. |