Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   При разборе кода примеров vkontakte API не могу понять одно место (http://www.flasher.ru/forum/showthread.php?t=127663)

Spazm 20.07.2009 12:39

При разборе кода примеров 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 какойнибудь. Наверное не очень внятно обяснил, но если кто понял - уделите пожалуйста немного времени и объясните идиоту где тут собака порылась. Заранее спасибо.

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.... но я не люблю легких путей!!!)))


Часовой пояс GMT +4, время: 01:46.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.