Почему может не заполняться массив?
Вобщем вот такое дело. Пишу скрипт под 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); но только с третьего раза. Тоесть скрипт надо запускать три раза вручную. При этом циклы и задержки не улучшают ситуацию. Приходится все равно запускать скрипт три раза. Если переменную обьявляю вначале, вообще не получается записать в нее данные( Скорее всего, после первого прохождения создается переменная, после второго в переменную записывается значение и последний раз уже выводится результат |
Часовой пояс GMT +3, время: 15:48. |