Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   API приложений и сред (http://www.flasher.ru/forum/forumdisplay.php?f=61)
-   -   APIConnection не срабатывают события (http://www.flasher.ru/forum/showthread.php?t=205121)

razerw 19.11.2013 17:57

APIConnection не срабатывают события
 
APIConnection не срабатывают события об отработке запроса или ошибки.
То есть я отрабатываю запрос VK.api('users.get', { user_ids:1, fields:'city,sex' }, onProfileLoaded, onError); в котором я хочу узнать фио и пол, но никакого события не происходит. Помогите пожалуйста разобраться.

Код AS3:

package vk {
 
        import flash.display.*;
    import flash.events.*;
    import vk.APIConnection;
    import vk.events.*;
    import vk.ui.VKButton;
        import vk.events.CustomEvent;
 
        public class VkAPI
        {
                // получаем flashVars
                //public static var flashVars:Object;
                //public static var VK:APIConnection;
                public static var api_id:Number;
        public static var viewer_id:Number;
        public static var sid:String;
        public static var secret:String;
                //private
                private static var idUserVk:*;
                private static var idUserVk2:*;
 
                public function VkAPI()
                {
 
                }
 
                //Узнаём ИД пользователя, ФИО, секретный код, ИД сессии.
                public static function vkId(param1:String)
                {
                        var flashVars:Object = Index.stage.loaderInfo.parameters as Object;
 
                    // присваиваем переменным значения из flashVars ЭТИ МЕТОДЫ ОТРАБАТЫВАЮТ
            api_id = flashVars['api_id'];
            viewer_id = flashVars['viewer_id'];
            sid = flashVars['sid'];
            secret = flashVars['secret'];
                        var VK:APIConnection = new APIConnection(flashVars);
                        VK.api('users.get', { user_ids:1, fields:'city,sex' }, onProfileLoaded, onError);// запрос отправляется но в ответ ничего не приходит
 
                        return idUserVk2;
 
                }
 
                private static function onProfileLoaded(data:Object)
                {
            idUserVk2 = data[0]['uid'];
 
                }
 
                private static function onError(data:Object):void
                {
                        idUserVk2 = data.first_name;
                        //trace(data.error_msg);
                }
 
        }
 
}


in4core 19.11.2013 18:19

Цитата:

var flashVars:Object = Index.stage.loaderInfo.parameters as Object;
Что такое индекс? У вас вообще ерунда написана какая то. Вечером выложу нормальный вид запроса, ждите

Добавлено через 2 часа 3 минуты
Код AS3:

package outcomebet.controllers 
{
        import com.in4core.utils.logger.I4Logger;
        import flash.display.DisplayObjectContainer;
        import outcomebet.events.PlayerModelEvents;
        import outcomebet.models.BaseModel;
        import outcomebet.views.BaseView;
        /**
        * ...
        * @author in4core progression lab
        */

        public final class BaseController extends Object
        {
                private var _host:DisplayObjectContainer        = null;
                private var _baseModel:BaseModel                        = new BaseModel();
                private var _baseView:BaseView                                = new BaseView();
 
                private var _vkWrapper:VKWrapper                        = new VKWrapper();
 
                public function BaseController(host:DisplayObjectContainer)
                {
                        _host = host;
                }
 
                public function init():void
                {
                        _vkWrapper.createAPI();
                        _vkWrapper.vkconnection.api("friends.get", _vkWrapper.getStandardFields(), onUsersInitialize, onVKCallBackError);
                }
 
                private function onVKCallBackError(o:Object):void
                {
                        trace("4:VK api call back error");
                }
 
                private function onUsersInitialize(o:Object):void
                {
                        _baseModel.friendsModel.fillFriends( o as Array );
                        _baseModel.friendsModel.addEventListener(PlayerModelEvents.ALL_FRIENDS_PHOTOS_LOADED , onAllFriendsPhotosLoaded);
                }
 
                private function onAllFriendsPhotosLoaded(e:PlayerModelEvents):void
                {
                        _vkWrapper.vkconnection.api("users.get", _vkWrapper.getStandardFields(), onClinetInitialize, onVKCallBackError);
                }
 
                private function onClinetInitialize(o:Object):void
                {
                        var obj:Object = o[0] as Object;
 
                        _baseModel.playerModel.addEventListener(PlayerModelEvents.USER_PHOTO_LOADED , onClientPhotoLoaded);
                        _baseModel.playerModel.fillFields(obj);
                }
 
                private function onClientPhotoLoaded(e:PlayerModelEvents):void
                {
                        I4Logger.print("App Ready!" , 0xFF0000);
 
                        _baseView.baseModel = _baseModel;
                        _host.addChild(_baseView);
                }
 
        }
 
}

Код AS3:

package outcomebet.controllers 
{
        import flash.errors.IllegalOperationError;
        import flash.events.EventDispatcher;
        import vk.APIConnection;
 
        /**
        * ...
        * @author in4core progression lab
        */

        public final class VKWrapper extends EventDispatcher
        {
                private var _vkconnection:APIConnection;
 
                public static var flashVars:Object = null;
 
                public function VKWrapper()
                {
 
                }
 
                public function createAPI():void
                {
                        if (flashVars) _vkconnection = new APIConnection(flashVars);
                        else throw new IllegalOperationError("FV - null");
                }
 
                public function get vkconnection():APIConnection
                {
                        return _vkconnection;
                }
 
                public function getStandardFields(id:uint = 0):Object
                {
                        if (!id) id = flashVars["viewer_id"];
 
                        return { user_ids : id , fields : "nickname, screen_name, photo_100" };
                }
 
 
 
        }
 
}

Код AS3:

package 
{
        import com.in4core.utils.logger.I4Logger;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.system.Security;
        import outcomebet.controllers.BaseController;
        import outcomebet.controllers.VKWrapper;
        import vk.APIConnection;
 
        /**
        * ...
        * @author in4core progression lab
        */

        [Frame(factoryClass="Preloader")]
 
        public class Main extends Sprite
        {
 
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
 
                        Security.loadPolicyFile("http://vk.com/crossdomain.xml");
 
                        var flashVars:Object = stage.loaderInfo.parameters as Object;
 
                        if (!flashVars.api_id)
                        {
                                flashVars['api_id'] = 1;
                                flashVars['viewer_id']1;
                                flashVars['sid'] = "XXX"
                                flashVars['secret'] =  "XXX";
                        }
 
 
                        VKWrapper.flashVars = flashVars;
 
                        I4Logger.print(flashVars);
 
                        var base:BaseController = new BaseController(this);
                        base.init();
                }
 
        }

Работатть будет) Тут много лишнего, того, что вам не надо, но думаю разберетесь

razerw 20.11.2013 10:00

Спасибо за пример. Я понял что этот скрипт получает данные только при старте флешке, получает и дальше продолжает отрабатывать другие методы. Но что делать если мне надо например прям в середине игры запросить и узнать какие то данные, то есть выполнить запрос _vkWrapper.vkconnection.api(); Как бы это могло выглядеть?

Добавлено через 9 минут
Цитата:

Сообщение от in4core (Сообщение 1152995)
Что такое индекс? У вас вообще ерунда написана какая то. Вечером выложу нормальный вид запроса, ждите

Индекс это ссылка на сцену, идет из главного класса как статическая переменная.

in4core 20.11.2013 12:11

Точно так же и выглядело бы. Вид посылает запрос контроллеру, контроллер запускает _vkWrapper. Все предельно просто

razerw 20.11.2013 12:52

Цитата:

Сообщение от in4core (Сообщение 1153045)
Точно так же и выглядело бы. Вид посылает запрос контроллеру, контроллер запускает _vkWrapper. Все предельно просто

кто такой Вид? получается если из любого класса то метод init в классе BaseController должен быть статическим?

Psycho Tiger 20.11.2013 13:01

Цитата:

Сообщение от razerw (Сообщение 1153052)
кто такой Вид? получается если из любого класса то метод init в классе BaseController должен быть статическим?

Вид – это какое-то творчество внутри BaseView, вестимо. Вы бы лучше зажмурили глаза и не смотрели на то, что Вам скинули – у него там ерунда какая-то :)

А Вы откуда тестируете? У меня предчувствие, что вся проблема из за того, что flashVars пустые (запуск локально).

razerw 20.11.2013 13:45

Цитата:

Сообщение от Psycho Tiger (Сообщение 1153053)
Вид – это какое-то творчество внутри BaseView, вестимо. Вы бы лучше зажмурили глаза и не смотрели на то, что Вам скинули – у него там ерунда какая-то :)

А Вы откуда тестируете? У меня предчувствие, что вся проблема из за того, что flashVars пустые (запуск локально).

я тестирую прям в самом вк, компилирую на компе получаю сообщение
{"error":{"error_code":101,"error_msg":"Invalid application API ID","request_params":[{"key":"format","value":"JSON"},{"key":"user_ids","value":"0"},{"key":"sig","value":"7eb76717bb32f434357cd95b316c7b9f"},{"key":"fields","value":"nickn ame, screen_name, photo_100"},{"key":"sid","value":"null"},{"key":"method","value":"users.get"},{"key":"api_id","value":"NaN"},{"key":"v","value":"3.0"}]}}

это же сообщение получаю если даже сделать так, и компилировать
Код AS3:

flashVars['api_id'] = 1728947;
            flashVars['viewer_id'] = 1306422;
            flashVars['sid'] = 'a1006fd1e8gb9bd669e1119280166bc6cb9110b8a111550333bf041301';
            flashVars['secret'] = '7ef8l6a4p8';



flashVars работает и присылает все данные, только что проверил вижу ид, секретный код и дт

Добавлено через 1 минуту
в статистике по приложению в АПИ вижу, что запросы в количестве 56 штук поступали к users.get

Добавлено через 2 часа 28 минут
Я нашел в чем причина, в моём коде
Код AS3:

package vk {
 
        import flash.display.*;
    import flash.events.*;
    import vk.APIConnection;
    import vk.events.*;
    import vk.ui.VKButton;
        import vk.events.CustomEvent;
 
        public class VkAPI
        {
                // получаем flashVars
                //public static var flashVars:Object;
                //public static var VK:APIConnection;
                public static var api_id:Number;
        public static var viewer_id:Number;
        public static var sid:String;
        public static var secret:String;
                //private
                private static var idUserVk:*;
                private static var idUserVk2:*;
 
                public function VkAPI()
                {
 
                }
 
                //Узнаём ИД пользователя, ФИО, секретный код, ИД сессии.
                public static function vkId(param1:String)
                {
                        var flashVars:Object = Index.stage.loaderInfo.parameters as Object;
 
                    // присваиваем переменным значения из flashVars ЭТИ МЕТОДЫ ОТРАБАТЫВАЮТ
            api_id = flashVars['api_id'];
            viewer_id = flashVars['viewer_id'];
            sid = flashVars['sid'];
            secret = flashVars['secret'];
                        var VK:APIConnection = new APIConnection(flashVars);
                        VK.api('users.get', { user_ids:1, fields:'city,sex' }, onProfileLoaded, onError);
 
                        return idUserVk2; // Приходит ундифенд
 
                }
 
                private static function onProfileLoaded(data:Object)
                {
            idUserVk2 = data[0]['uid']; // и только потом сюда попадают данные
 
                }
 
                private static function onError(data:Object):void
                {
                        idUserVk2 = data.first_name;
                        //trace(data.error_msg);
                }
 
        }
 
}


Frost47rus 21.11.2013 02:36

Код AS3:

_vkWrapper.vkconnection.api(

Вот это вообще наповал. Враппер для враппера.
Их (Вк-шные) классы из коробки уже сами по себе - враппер.

По теме - научитесь разделять овец и баранов в коде.
ID сессии ВК получается из GET параметров, которые передаются флешке параметрами.
Код AS3:

stage.loaderInfo.parameters // Object

В зависимости от того, настроен ли у вас в приложении первый запрос к API - в эти параметры будет включен так же и результат запроса.

В коде, который вы привели в самом начале - параметр
Код AS3:

idUserVk

в момент вызова
Код AS3:

return idUserVk

будет скорее всего null или undefined.
Вы отправляете к ВК серверу запрос на получение данных. И в этом же кадре обращаетесь к переменной, которая должна быть определена только после ответа сервера ВК.
Вам следует вникнуть в азы работы клиент-серверных приложений. И только потом уже разбираться с API.

razerw 21.11.2013 08:54

Цитата:

Сообщение от Frost47rus (Сообщение 1153146)
Код AS3:

_vkWrapper.vkconnection.api(

Вот это вообще наповал. Враппер для враппера.
Их (Вк-шные) классы из коробки уже сами по себе - враппер.

По теме - научитесь разделять овец и баранов в коде.
ID сессии ВК получается из GET параметров, которые передаются флешке параметрами.
Код AS3:

stage.loaderInfo.parameters // Object

В зависимости от того, настроен ли у вас в приложении первый запрос к API - в эти параметры будет включен так же и результат запроса.

В коде, который вы привели в самом начале - параметр
Код AS3:

idUserVk

в момент вызова
Код AS3:

return idUserVk

будет скорее всего null или undefined.
Вы отправляете к ВК серверу запрос на получение данных. И в этом же кадре обращаетесь к переменной, которая должна быть определена только после ответа сервера ВК.
Вам следует вникнуть в азы работы клиент-серверных приложений. И только потом уже разбираться с API.

Совершенно верно вы подметили при ходит undefined потому что отправляю запрос и тут же return idUserVk
Подскажите пожалуйста как можно реализовать получение ответа после получения ответа от апи вк?

caseyryan 21.11.2013 11:14

Цитата:

Подскажите пожалуйста как можно реализовать получение ответа после получения ответа от апи вк?
Посылать свое событие по приходу ответа от вк, и в нужном месте слушать это событие.

Но, имхо, с колбэками гораздо удобнее. У меня вообще библиотека работы с вк и одноклассниками работает только через статические методы. Что-то типа
Код AS3:

Social.getFriendList(onSuccess, onError);

Просто передаем туда ссылки на методы-колбэки, и один из них вызывается при получении ответа от вк или одноклассников. После чего ссылки на оба метода обнуляются. Не нужно никаких лишних подписок на события, все довольно удобно.


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

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