 
			
				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,150
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 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.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 |  
  |