Почему может не заполняться массив?
Вобщем вот такое дело. Пишу скрипт под 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); результат тот же( |
Асинхронность. Почитайте про callback функции
|
var uids = [];
setTimeout('alert("Обрабатываю и Отправляю запрос");uids = [1,2,3,4,5]',100);
alert("читаю массив uids="+uids)
setTimeout('alert("Пришло uids ="+uids)',1000);
|
Хм.. почитал. В таком случае я не понимаю, почему у меня не срабатывает вот это:
param1 = new Object;
param1.uid = parseInt(cur.oid);
var uids = dApi.call('friends.getOnline',param1,function(r){return r.response;});
alert (uids);
В данном случае я функцию передаю как параметр. Но почему тогда значения алертом я вывести могу, а в переменную почти тем же образом записать не могу? |
Torero,
Потому что данные от аякса приходят через время - а читаете - Вы сразу, Поэтому вся обработка полученного должна вестись в callback полученного запроса, a 90 % новопользователей Aякс норовят обработать в теле программы, Вызывайте и передавайте полученное из callback в функцию дальнейшей обработки, |
Цитата:
Попробывал вот так, тоже ничего не вышло:
var uids = [];
dApi.call('friends.getOnline',param1,function(r){setTimeout('uids = r.response.slice()',3000);});
alert(uids);
|
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){ }); И ее надо использовать... |
Torero,
|
Цитата:
Срабатывает вот такой вариант:
dApi.call('friends.getOnline',param1,function(ret){
uids = ret.response;
});
alert(uids);
но только с третьего раза. Тоесть скрипт надо запускать три раза вручную. При этом циклы и задержки не улучшают ситуацию. Приходится все равно запускать скрипт три раза. Если переменную обьявляю вначале, вообще не получается записать в нее данные( Скорее всего, после первого прохождения создается переменная, после второго в переменную записывается значение и последний раз уже выводится результат |
Вобщем выкрутился тем, что сделал скрытый текст через .innerHTML, и потом по нажатию кнопки распарсивал его на массив и с ним уже вел дальнейшую работу. =( В дальнейшем подумаю как это все внутри функции реализовать
|
| Часовой пояс GMT +3, время: 00:34. |