PDA

Просмотр полной версии : При разборе кода примеров vkontakte API не могу понять одно место


Spazm
20.07.2009, 12:39
Здравствуйте, у меня следующий вопрос:"При разборе кода примеров vkontakte API не могу понять одно место".
//Я еще плохо разбираюсь во флеше, actionscripte и ООП в частности.
Разбираю код, представленный на:
http://vkontakte.ru/pages.php?o=-1&p=%C4%EE%EA%F3%EC%E5%ED%F2%E0%F6%E8%FF%20API%20%C2%CA%EE%ED%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 какойнибудь. Наверное не очень внятно обяснил, но если кто понял - уделите пожалуйста немного времени и объясните идиоту где тут собака порылась. Заранее спасибо.

terbooter
20.07.2009, 14:16
Это анонимная функция.
Или литерал функции. висит там же где и любая локальная переменная.

Примеры для апи в контакте написаны пхп прогерами и мягко говоря не очень

Spazm
20.07.2009, 14:34
значение response_this я могу получить только внутри этой функции. Даже к классу приходится обращаться как _global.test_ex.myFunction. Получается это обращение:"dataProvider.getInstPril(user_dead_mas[d]['uid'],function(success:Boolean)" вообще где-то в воздухе. Можно, конечно через всякие _global-ы работать, но как-то это не правильно наверное. А переписать функцию так, чтобы как обычный понятный мне метод не получается т.к. не понимаю смысл конструкции вообще. Может кто по шагам сможет объяснить мне тупоголовому что делается7
"if (success" не понимаю((( откуда success. И ели никто не против предыдущие вопросы тоже хотелось бы прояснить. Спасибо за внимание к теме.

terbooter
20.07.2009, 14:47
success это параметр, который получит данная анонимная функция.
Нужно смотреть по коду где вызывается функция, там и передается параметр.

Wolsh
20.07.2009, 15:30
А чем Вас flashvars не устроили?
При отображении приложения посредством flashvars в него передаются следующие параметры:

* api_id – это id запущенного приложения.
...

* is_app_user – если пользователь установил приложение – 1, иначе – 0.

dimarik
20.07.2009, 16:06
Он у viewer_id друзей хочет проверить на isAppUser.

Spazm
20.07.2009, 16:15
Почитаю про анонимные функции))) Спасибо, что пнули.

Добавлено через 2 часа 52 минуты
Впринципе есть getAppFriends.... но я не люблю легких путей!!!)))