Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.03.2013, 23:49
Интересующийся
Отправить личное сообщение для Torero Посмотреть профиль Найти все сообщения от Torero
 
Регистрация: 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);
результат тот же(
Ответить с цитированием
  #2 (permalink)  
Старый 12.03.2013, 01:04
Профессор
Отправить личное сообщение для zebra Посмотреть профиль Найти все сообщения от zebra
 
Регистрация: 14.09.2011
Сообщений: 523

Асинхронность. Почитайте про callback функции
Ответить с цитированием
  #3 (permalink)  
Старый 12.03.2013, 01:45
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

var uids = [];
setTimeout('alert("Обрабатываю и Отправляю запрос");uids = [1,2,3,4,5]',100);
alert("читаю массив uids="+uids)
setTimeout('alert("Пришло uids ="+uids)',1000);
Ответить с цитированием
  #4 (permalink)  
Старый 12.03.2013, 01:49
Интересующийся
Отправить личное сообщение для Torero Посмотреть профиль Найти все сообщения от Torero
 
Регистрация: 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);


В данном случае я функцию передаю как параметр. Но почему тогда значения алертом я вывести могу, а в переменную почти тем же образом записать не могу?
Ответить с цитированием
  #5 (permalink)  
Старый 12.03.2013, 02:09
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Torero,
Потому что данные от аякса приходят через время - а читаете - Вы сразу,
Поэтому вся обработка полученного должна вестись в callback полученного запроса,
a 90 % новопользователей Aякс норовят обработать в теле программы,
Вызывайте и передавайте полученное из callback в функцию дальнейшей обработки,
Ответить с цитированием
  #6 (permalink)  
Старый 12.03.2013, 02:09
Интересующийся
Отправить личное сообщение для Torero Посмотреть профиль Найти все сообщения от Torero
 
Регистрация: 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);
Ответить с цитированием
  #7 (permalink)  
Старый 12.03.2013, 02:11
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 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.
Ответить с цитированием
  #8 (permalink)  
Старый 12.03.2013, 10:54
Интересующийся
Отправить личное сообщение для Torero Посмотреть профиль Найти все сообщения от Torero
 
Регистрация: 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){ });
И ее надо использовать...
Ответить с цитированием
  #9 (permalink)  
Старый 12.03.2013, 11:38
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,108

Torero,
var uids = []; попробуйте без var, может дело в видимости
Ответить с цитированием
  #10 (permalink)  
Старый 12.03.2013, 12:12
Интересующийся
Отправить личное сообщение для Torero Посмотреть профиль Найти все сообщения от Torero
 
Регистрация: 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.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему некоторые операторы возвращают значения, а не ссылки? dump Общие вопросы Javascript 15 25.07.2012 17:28
Ассоциативный и обычный массив. Почему не получается получить свойство? jsuse Общие вопросы Javascript 10 04.12.2011 22:14
Почему может не работать? lanzs Firefox/Mozilla 8 04.10.2010 23:15
Почему может не работать value в textarea Snipe Элементы интерфейса 2 24.02.2009 19:27
ассоциативный массив где ключ это год или ..... Sandr Общие вопросы Javascript 8 18.07.2008 15:39