Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   return после ответа сервера (http://www.flasher.ru/forum/showthread.php?t=194791)

loigor3 22.02.2013 14:06

return после ответа сервера
 
Здравствуйте. Возникла следующая задача:есть функция подключения к серверу и функция приема и обработки ответа
Код AS1/AS2:

private function server_connect(type:Number = 0):void
                {
                        var loader:URLLoader  = new URLLoader();
                        var request:URLRequest = new URLRequest("сервер");
                        request.method                  = URLRequestMethod.POST;
                        var vars:URLVariables  = new URLVariables();
                        vars['type']        = type
                        request.data = vars;
                        loader.load(request);
                        loader.addEventListener(Event.COMPLETE, load)
                        function load(e:Event):void
                        {
                                var str = String(loader.data);
                                if (str == loader.data)
                                {
                                        if(str == "0")
                                        {
                                                error.error()
                                        }else
                                        {
 
                                        }
                                }
                        }
                }

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

iNils 22.02.2013 14:56

1. Анонимные функции - зло. Что вам мешаете определить function load в теле класса?
2. Запрос/ответ к серверу - это асинхронная операция, т.е. ваш код не будет ждать ответа, а будет исполняться дальше, соответственно return сделать нельзя. Поэтому функция load должна содержать или вызывать код, в который вы хотели сделать ваш return.

caseyryan 22.02.2013 14:59

я, для упрощения себе задачи, создал класс, который работает с запросом
Код AS3:

package  {
        import flash.events.Event;
        import flash.events.EventDispatcher;
        import flash.events.IOErrorEvent;
        import flash.events.SecurityErrorEvent;
        import flash.net.URLLoader;
        import flash.net.URLLoaderDataFormat;
        import flash.net.URLRequest;
        import flash.net.URLRequestMethod;
        import flash.net.URLVariables;
 
        public class Packet extends EventDispatcher {
 
                public static const HOST:                String                = "http://server.com/";
                public static const SCRIPT:                String                = "call.php";
                public static var PASS:                        String                = "paswordHere";
                public static var USER_ID:                String                = "userId";
 
                private var _callback:                Function        = null;
 
                /**
                *
                * @param        называние метода, который нужно вызывать на сервере, передается в
                * POST с ключом method
                * @param        callback метод который вызывается после прихода ответа от сервера
                * должен принимать один параметр типа Object
                */

                public function Packet(method:String, callback:Function, params:Object = null) {
                        _callback                                = callback;
                        var loader:        URLLoader        = new URLLoader();
                        loader.addEventListener(Event.COMPLETE, onComplete);
                        loader.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
                        loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
                        loader.dataFormat                = URLLoaderDataFormat.VARIABLES;
                        var vars:URLVariables        = new URLVariables();
                        vars['method']                        = method;
                        vars['pass']                        = PASS;
                        vars['userId']                        = USER_ID;
                        if (params != null) {
                                for (var i:String in params) {
                                        vars[i] = params[i];
                                }
                        }
                        var rand:        String                = "?" + int(Math.random() * 10000);
                        var request:URLRequest        = new URLRequest(Packet.HOST + Packet.SCRIPT + rand);
                        request.method                        = URLRequestMethod.POST;
                        request.data                        = vars;
                        trace(request.data.toString());
                        try {
                                loader.load(request);
                        } catch (e:Error) {
                                trace(e.getStackTrace());
                        }
 
                }
 
                private function onSecurityError(e:SecurityErrorEvent):void {
                        e.target.removeEventListener(Event.COMPLETE, onComplete);
                        e.target.removeEventListener(IOErrorEvent.IO_ERROR, onIOError);
                        e.target.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
                }
 
                private function onIOError(e:IOErrorEvent):void {
                        e.target.removeEventListener(Event.COMPLETE, onComplete);
                        e.target.removeEventListener(IOErrorEvent.IO_ERROR, onIOError);
                        e.target.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
                        trace("INPUT / OUTPUT ERROR");
                }
 
                private function onComplete(e:Event):void {
                        e.target.removeEventListener(Event.COMPLETE, onComplete);
                        e.target.removeEventListener(IOErrorEvent.IO_ERROR, onIOError);
                        e.target.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
                        var data:Object = e.target.data as Object;
                        trace("PACKET DATA:", this, unescape(String(data))); // отображает запрос к серверу
                        if (_callback != null) {
                                _callback.call(null, data);
                        }
                }
        }
}

Используется просто. Где-то в коде просто создаем новый пакет:
Код AS3:

var packet:Packet = new Packet("someServerMethod", onPacketData); // можно так же передать объект с переменныи. Они прийдут на сервер в запросе POST, в котором ключи и значения буду соответствовать ключам из начениям в переданном объекте
 
function onPacketData(params:Object):void { // вообще, в место Object надо бы URLVariables принимать. Но с объектом тоже прокатывает
    // здесь можно обрабатывать пришедшие данные
}


loigor3 22.02.2013 15:51

iNils, спасибо, учту.
caseyryan, спасибо, слямзил)


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

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