Показать сообщение отдельно
Старый 20.07.2009, 12:39
Spazm вне форума Посмотреть профиль Отправить личное сообщение для Spazm Найти все сообщения от Spazm
  № 1  
Ответить с цитированием
Spazm

Регистрация: Jul 2009
Сообщений: 20
По умолчанию При разборе кода примеров vkontakte API не могу понять одно место

Здравствуйте, у меня следующий вопрос:"При разборе кода примеров vkontakte API не могу понять одно место".
//Я еще плохо разбираюсь во флеше, actionscripte и ООП в частности.
Разбираю код, представленный на:
http://vkontakte.ru/pages.php?o=-1&p...F2%E0%EA%F2%E5
по ссылке:
http://vkontakte.ru/source/Tetris.zip

В файле DataProvider.as, в функции _sendRequest, я так понимаю идет отсыл данных.
Код:
  private function _sendRequest(method:String, options:Object)
  {
     ...
  }
Как я понимаю, получает метод API и параметры для запроса.
По аналогии с представленным в этом файле кодом я написал обращение к этой функции через функцию:
Код:
  public function getInstPril(uid:String,onComplete:Function):String
  {
	  var t="ggg";
	  _sendRequest("isAppUser", {params:{uid:uid}, onComplete:onComplete})
	  return t;	  
  }//end function
Далее в произвольном классе test.as подключаю import Tetris.DataProvider;
Далее по аналогии с вложенным в пример кодом пишу private var dataProvider: DataProvider;
В конструкторе класса - dataProvider = new DataProvider();
До этого момента может и не все понимаю, но работает.
Далее описываю метод для получения установил ли юзер приложение к себе или нет:
Код:
public function getInstUser()//Вернем - установил ли юзер приложение
{
 var inst_yes=0;//По умолчанию - приложение у юзера не установлено
//Получим массив данных пользователей:
var user_dead_mas:Array = new Array;
user_dead_mas=getFriendDataMas();//Получим копию массива данных всех юзеров
			
   for(var d=0;d<user_dead_mas.length;d++)//Переберем весь массив
   {
     trace("d="+d);
     setDInstTek(d);//Закинем в класс d
     setDInstOk(0);//Укажем, что пользователь еще не обработан
     trace("ok="+_global.test_ex.getDInstOk());
     dataProvider.getInstPril(user_dead_mas[d]['uid'],function(success:Boolean)
     {
	//Здесь нужно получить id, который обрабатывается
          if (success && _global.test_ex.getDInstOk()==0) 
	{
	  for (var fNode:XMLNode = this.firstChild; fNode != null; fNode = fNode.nextSibling) 
		{
          		var response_this: String;
		for (var cNode:XMLNode = fNode.firstChild; cNode != null; cNode = cNode.nextSibling) 
		{
              	switch (cNode.nodeName)
		{
                	case 'response':   response_this = cNode.firstChild.nodeValue;    break;
		}//end switch
            }//end for	
							
        	}//end for
	trace("this=="+this);
	trace("response_this="+response_this);
	var d_tek=_global.test_ex.getDInstTek();
	_global.test_ex.setInstPrilUserAdd(d_tek,response_this);
	_global.test_ex.setDInstOk(1);
					
	}//end if (success)
	}),100);//end dataProvider
				
				
			
	}//end for
	_global.test_ex.setObnovlenFriendIdMas(5);
	trace("юзер="+inst_yes);
	}//end function
Там пару флогов поставил, ненужные трейсы для проверок и д.т.
Во-первых не понимаю строку:"dataProvider.getInstPril(user_dead_mas[d]['uid'],function(success:Boolean)".
Это где эта фнкция висит? В dataProvider?. Не понимаю как можно передать в качестве параметра функцию.Или здесь что-то другое делается? Когда срабатывает код, описанный в этой getInstPril? Данные есть, обрабатываются, но как-то странно - в трейсе вижу, что перебирается for, а эта функция выполняется как-то независимо от цыкла. В руководстве:"http://vkontakte.ru/pages.php?o=-1&p=%C2%E7%E0%E8%EC%EE%E4%E5%E9%F1%F2%E2%E8%E5%20%EF%F0%E8%EB%EE%E6%E5%ED%E8%FF%20%F1%20API" написано, что:"Сервер принимает не более трёх запросов в секунду". Как сделать, чтобы эта (для меня непонятно где зависшая функция с передающим (или получающим?) в качестве параметра функцию (тоже не очень понятно как работающую), так вот чтобы эта функция была нормальым вызовом в цыкле и, например с проверкой на setTimeOut какойнибудь. Наверное не очень внятно обяснил, но если кто понял - уделите пожалуйста немного времени и объясните идиоту где тут собака порылась. Заранее спасибо.