11.03.2013, 23:49
|
Интересующийся
|
|
Регистрация: 11.03.2013
Сообщений: 20
|
|
Почему может не заполняться массив?
Вобщем вот такое дело. Пишу скрипт под 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);
результат тот же(
|
|
12.03.2013, 01:04
|
Профессор
|
|
Регистрация: 14.09.2011
Сообщений: 523
|
|
Асинхронность. Почитайте про callback функции
|
|
12.03.2013, 01:45
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
var uids = [];
setTimeout('alert("Обрабатываю и Отправляю запрос");uids = [1,2,3,4,5]',100);
alert("читаю массив uids="+uids)
setTimeout('alert("Пришло uids ="+uids)',1000);
|
|
12.03.2013, 01:49
|
Интересующийся
|
|
Регистрация: 11.03.2013
Сообщений: 20
|
|
Хм.. почитал. В таком случае я не понимаю, почему у меня не срабатывает вот это:
param1 = new Object;
param1.uid = parseInt(cur.oid);
var uids = dApi.call('friends.getOnline',param1,function(r){return r.response;});
alert (uids);
В данном случае я функцию передаю как параметр. Но почему тогда значения алертом я вывести могу, а в переменную почти тем же образом записать не могу?
|
|
12.03.2013, 02:09
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
Torero,
Потому что данные от аякса приходят через время - а читаете - Вы сразу,
Поэтому вся обработка полученного должна вестись в callback полученного запроса,
a 90 % новопользователей Aякс норовят обработать в теле программы,
Вызывайте и передавайте полученное из callback в функцию дальнейшей обработки,
|
|
12.03.2013, 02:09
|
Интересующийся
|
|
Регистрация: 11.03.2013
Сообщений: 20
|
|
Сообщение от Deff
|
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);
|
|
12.03.2013, 02:11
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
Torero,
Попробуйте так:
var uids = [];
dApi.call('friends.getOnline',param1,function(r){setTimeout('uids = r.response.slice()',3000);});
setTimeout('alert("Пришло uids ="+uids)',1000);
Но это конечно жуткий изврат
Вызывать и передавать в обработку нужно из Callback
Последний раз редактировалось Deff, 12.03.2013 в 02:13.
|
|
12.03.2013, 10:54
|
Интересующийся
|
|
Регистрация: 11.03.2013
Сообщений: 20
|
|
Сообщение от Deff
|
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
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,108
|
|
Torero,
var uids = []; попробуйте без var, может дело в видимости
|
|
12.03.2013, 12:12
|
Интересующийся
|
|
Регистрация: 11.03.2013
Сообщений: 20
|
|
Сообщение от рони
|
Torero,
var uids = []; попробуйте без var, может дело в видимости
|
Попробывал различные вариации с var и без него.
Срабатывает вот такой вариант:
dApi.call('friends.getOnline',param1,function(ret){
uids = ret.response;
});
alert(uids);
но только с третьего раза. Тоесть скрипт надо запускать три раза вручную. При этом циклы и задержки не улучшают ситуацию. Приходится все равно запускать скрипт три раза. Если переменную обьявляю вначале, вообще не получается записать в нее данные(
Скорее всего, после первого прохождения создается переменная, после второго в переменную записывается значение и последний раз уже выводится результат
Последний раз редактировалось Torero, 12.03.2013 в 12:19.
|
|
|
|