Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Почему может не заполняться массив? (https://javascript.ru/forum/misc/36321-pochemu-mozhet-ne-zapolnyatsya-massiv.html)

Torero 11.03.2013 23:49

Почему может не заполняться массив?
 
Вобщем вот такое дело. Пишу скрипт под Greasmonkey. столкнулся с проблемой. пишу следующий код:
param1 = new Object;
param1.uid = parseInt(cur.oid);
dApi.call('friends.getOnline',param1,function(r){
for(var i=0; i<r.response.length; i++){
alert(r.response[i]);
}
});

И скрипт послушно выдает мне алертом сообщения типа 1234, 12345, 11, 33, тоесть я получаю данные. Далее я хочу эти данные записать в массив, чтобы ими пользоваться в дальнейшем:
param1 = new Object;
param1.uid = parseInt(cur.oid);
var uids = [];
dApi.call('friends.getOnline',param1,function(r){
for(var i=0; i<r.response.length; i++){
uids.push(r.response[i]);
}
});
alert(uids.length);

Результирущее значение длинны массива равняется нулю((
Если я попытаюсь обратиться к uids[0] то увижу там undefined. В чем может быть проблема?
Пытался также делать так
uids.push(parseInt(r.response[i]));
uids.push(r.response[i].toString);
результат тот же(

zebra 12.03.2013 01:04

Асинхронность. Почитайте про callback функции

Deff 12.03.2013 01:45

var uids = [];
setTimeout('alert("Обрабатываю и Отправляю запрос");uids = [1,2,3,4,5]',100);
alert("читаю массив uids="+uids)
setTimeout('alert("Пришло uids ="+uids)',1000);

Torero 12.03.2013 01:49

Хм.. почитал. В таком случае я не понимаю, почему у меня не срабатывает вот это:
param1 = new Object;
param1.uid = parseInt(cur.oid);
var uids = dApi.call('friends.getOnline',param1,function(r){return r.response;});
alert (uids);


В данном случае я функцию передаю как параметр. Но почему тогда значения алертом я вывести могу, а в переменную почти тем же образом записать не могу?

Deff 12.03.2013 02:09

Torero,
Потому что данные от аякса приходят через время - а читаете - Вы сразу,
Поэтому вся обработка полученного должна вестись в callback полученного запроса,
a 90 % новопользователей Aякс норовят обработать в теле программы,
Вызывайте и передавайте полученное из callback в функцию дальнейшей обработки,

Torero 12.03.2013 02:09

Цитата:

Сообщение от Deff (Сообщение 240123)
var uids = [];
setTimeout('alert("Обрабатываю и Отправляю запрос");uids = [1,2,3,4,5]',100);
alert("читаю массив uids="+uids)
setTimeout('alert("Пришло uids ="+uids)',1000);

Тоесть возможно пока выполняется функция, я уже пытаюсь записать значение еще не полученной переменной в новую переменную?
Попробывал вот так, тоже ничего не вышло:
var uids = [];
dApi.call('friends.getOnline',param1,function(r){setTimeout('uids = r.response.slice()',3000);});
alert(uids);

Deff 12.03.2013 02:11

Torero,
Попробуйте так:
var uids = [];
dApi.call('friends.getOnline',param1,function(r){setTimeout('uids = r.response.slice()',3000);});
setTimeout('alert("Пришло uids ="+uids)',1000);


Но это конечно жуткий изврат

Вызывать и передавать в обработку нужно из Callback

Torero 12.03.2013 10:54

Цитата:

Сообщение от Deff (Сообщение 240128)
Torero,
Попробуйте так:
var uids = [];
dApi.call('friends.getOnline',param1,function(r){setTimeout('uids = r.response.slice()',3000);});
setTimeout('alert("Пришло uids ="+uids)',1000);


Но это конечно жуткий изврат

Вызывать и передавать в обработку нужно из Callback

Так не работает.
Даже вариант:
dApi.call('friends.getOnline',param1,function(r){setTimeout('alert (r.response)',1000);});


не выводит никаких сообщений.

Вот все дело в том, что к уже готовым функциям у меня доступа нет.
Есть готовая функция dApi.call('friends.getOnline',param1,function(r){ });
И ее надо использовать...

рони 12.03.2013 11:38

Torero,
var uids = []; попробуйте без var, может дело в видимости

Torero 12.03.2013 12:12

Цитата:

Сообщение от рони (Сообщение 240159)
Torero,
var uids = []; попробуйте без var, может дело в видимости

Попробывал различные вариации с var и без него.
Срабатывает вот такой вариант:
dApi.call('friends.getOnline',param1,function(ret){
uids = ret.response;
});
alert(uids);

но только с третьего раза. Тоесть скрипт надо запускать три раза вручную. При этом циклы и задержки не улучшают ситуацию. Приходится все равно запускать скрипт три раза. Если переменную обьявляю вначале, вообще не получается записать в нее данные(
Скорее всего, после первого прохождения создается переменная, после второго в переменную записывается значение и последний раз уже выводится результат


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