Форум 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)
-   -   проверка "Капчи" - задержка в коде (http://www.flasher.ru/forum/showthread.php?t=116316)

Mur4ik 26.09.2008 04:03

проверка "Капчи" - задержка в коде
 
Есть у меня необходимость проверки капчи:

проверяю я так
Код:

function isDataCorrect():Boolean
{
        if (isCaptchaCorrect(_root.tCapcha.text) == false)
        {
                _root.MessageBox("ОШИБКА!!!", "Вы не правильно ввели код с изображения");
                getCaptcha(_root.cldrCaptcha);
                return false;
        }
        ....
        return true;
}

а вот функция проверки именно капчи
Код:

function isCaptchaCorrect(sCode:String):Boolean
{
        var oResponceData:Object = { };
       
        var sSend:String = '<?xml version="1.0" encoding="UTF-8"?><envelop type="captcha" session="' + $strSessionId + '" captcha_code="' + sCode + '" />';
       
        var xmlSend:XML = new XML(sSend);
       
        XMLParser.sendAndLoad(xmlSend, server_url, fnOnLoad, oResponceData, false, true);
       
        function fnOnLoad($bSuccess:Boolean, oResponceData:Object, $xmlOriginal:XML):Void
        {
                if ($bSsuccess) {
                        echo("Капча: |>" + sCode + " - " + oResponceData.section[0].item[1].value);
                        echo($xmlOriginal);
                } else {
                        echo("Connection error");
                }
        }
       
        // TODO: вот тутачки нужно вставить задержку
       
        if (oResponceData.section[0].item[1].value == "correct") {
                echo("Капча: ||>" + sCode + " - " + oResponceData.section[0].item[1].value);
                return true;
        } else {
                echo("Капча: |||>" + sCode + " - " + oResponceData.section[0].item[1].value);
                return false;
        }
}

проблема в том что я проверяю oResponceData.section[0].item[1].value
тогда когда это значение еще не определено (не пришло с сервера),
как правильно в данном случае выдержать паузу перед этим фрагментом кода

или как вернуть значение функции isCaptchaCorrect(...) из fnOnLoad(...);

или какие вообще алгоритмы используются в подобных проверках
подскажите, пожалуйста....

З.Ы. В поиске рылся ничего подходящего для себя в данном случае
с исп. setInterval или setTimeout не нашел (или не сообразил)

dimarik 26.09.2008 11:53

Аниснхронность в данном случает подразумевает проверку isCaptchaCorrect после получения ответа от сервера. Никаких задержек вводить не надо =).

Mur4ik 26.09.2008 11:58

Это понятно, а как определить что ответ уже получен вне функции fnOnLoad ?

AlexDesinger 26.09.2008 13:49

http://www.flasher.ru/forum/showthread.php?t=112398 посмотрите тут, возможно это вам поможет.

Mur4ik 26.09.2008 14:26

спасибо, но это не к моему случаю...

неужели никто и никогда сталкивался с такой проблемой....?

Можно и по-другому:
Возможно ли вернуть значение родительской функции из дочерней,
т.е если функции вложенные (хотя где то попадалось что вложенные функции это и не лучшая практика), то вернуть return для родительской функции из вложенной?

Mur4ik 27.09.2008 02:58

Неужели у местных ГУРУ нет никаких мыслей по данному вопросу?
Ситуация вроде очень распространенная когда нужно определить пришел ли ответ от сервера или нет после запроса...
Никто не подскажет в каком направлении копать для решения проблемы?

7thsky™ 27.09.2008 03:24

менять структуру. Синхронно отослать и получить ответ в одном блоке кода нельзя. точнее не возможно во флэше

Mur4ik 27.09.2008 03:32

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

Просто думал есть какой то универсальное и наработанное кем то решение (совет) при организации общения с сервером и уж тем более с проверкой "Капчей". )

Если никто больше опытом поделится не хочет :),
то вопрос можно считать закрытым...

Всем спасибо.

qazwsx 02.10.2008 18:39

Послал запрос... Ждеш ответа. Ответ прийдет всегда. Если undefined то твой сервер не доступен или ничего не ответил... Незнаю о каких ты цепочках говориш....

Код:

import utils.Timer;

class Systems.Net.MXMLSocket extends LoadVars{
        public var onError:Function;
        public var onRecive:Function;
       
        private var query:String = '';
       
        private var server:String;
       
        private var bLoaded:Number = 0;
       
        private var timeOutTimer:Timer;
       
        public function MXMLSocket(_server:String, timeOut:Number ){
                this.server = _server;

                timeOutTimer = undefined;

                if ( timeOut > 0 )
                        initTimeOutTimer( timeOut );
               
        }
       
        public function get bytesLoad():Number{
                return bLoaded;
        }
       
        private function onData(data:String):Void {
               
                this.stopTimeOutTimer();
               
                var bytes:Number = this.getBytesTotal();
                bLoaded += bytes;
                if(data==undefined){
                        onErrorHandler("mxml server dont response on " + this.server );
                        return;
                }
                onRecive(data);
        }
       
        public function send(str:String):Void
        {
                query = str;

                this.postData(this);
        }
       
       
        public function sendObj(obj:Object):Void{
                var sendObject:LoadVars = new LoadVars();
                for(var vr:String in obj){
                        sendObject[vr] = obj[vr];
                }
               
                //sendObject.onData = Delegate.create(MXMLSOcket, onData);
               
                //sendObject.sendAndLoad(server, this, 'POST');
               
                //this.checkTimeOut();
               
                postData( sendObject );
               
        }
       
        private function postData( sendObject:LoadVars ):Void
        {
                sendObject.sendAndLoad(server, this, 'POST');
               
                if ( this.isTimeOutEnable() )
                {
                        this.startTimeOutChecker();
                }               
        }
       
       
        private function onErrorHandler(reason:String):Void
        {
                this.stopTimeOutTimer();
                this.onError( reason );
        }
       
       
        /// --- timeout
       
        private function initTimeOutTimer( timeOut:Number ):Void
        {
                timeOutTimer = new Timer( timeOut , false );
                timeOutTimer.addEventListener( Timer.TICK_EVENT , Delegate.create(this, onTimeOutHandler) );
        }       
       
       
        private function onTimeOutHandler(event:Object):Void
        {
                //this.stopTimeOutTimer();
                this.onErrorHandler( "mxml server "+ this.server +" dont response, time out " + this.timeOutTimer.durationSeconds );
        }
       
        private function isTimeOutEnable():Boolean
        {
                return this.timeOutTimer != undefined;
        }
       
        private function startTimeOutChecker():Void
        {
                this.timeOutTimer.turnOn();
        }
       
        private function resetTimeOutTimer():Void
        {
                this.timeOutTimer.reset();
        }
       
        private function stopTimeOutTimer():Void
        {
                this.timeOutTimer.turnOff();
        }
       
        /// timeout ---
}

Код:

import mx.events.EventDispatcher;

class utils.Timer extends mx.events.EventDispatcher
{
       
        public static var TICK_EVENT:String = "TICK_EVENT";
        private static var SECONDE:Number = 1000;
       
        var interValId:Number;
       
        var _duration:Number;
       
        public function Timer( duration:Number )
        {
                super();
                this._duration = duration*SECONDE;
                this.interValId = undefined;
               
        }
       
       
       
       
        public function turnOn():Void
        {
               
                //trace( "tutils.Timer.urnOn " + this.durationMillSec );
               
                if ( enable )
                        this.turnOff();
               
                this.interValId = setInterval( Delegate.create( this , onIntervalHandler ) , this.durationMillSec );
               
        }
       
        public function turnOff():Void
        {
               
                this.clearInternalInterval();
        }
       
       
        public function get enable():Boolean
        {
                return interValId != undefined;
        }
       
        public function set enable( val:Boolean ):Void
        {
                if ( val == this.enable )
                {
                        return;
                }
               
                if ( val )
                        turnOn();
                else
                        turnOff();
        }
       
        public function reset():Void
        {
                this.turnOff();
                this.turnOn();
        }
               
        public function get durationMillSec():Number
        {
                return this._duration;
        }
       
        public function set durationMillSec(arg:Number):Void
        {
                this._duration = arg;
                reset();
        }
       
        public function get durationSeconds():Number
        {
                return durationMillSec/SECONDE;
        }
       
        public function set durationSeconds(arg:Number):Void
        {
                this.durationMillSec = arg*SECONDE;
        }
       
       
        private function onIntervalHandler():Void
        {
                this.dispatchEvent( { type:TICK_EVENT } );
        }
       
        private function clearInternalInterval():Void
        {
               
                if ( !this.enable )
                        return;
               
                clearInterval( this.interValId );
                this.interValId = undefined;
               
        }
       
       

       
       
}

Часть кода подвырезана...

У меня лично делегат на onRecive передает строку далее парсеру...


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

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