PDA

Просмотр полной версии : проверка "Капчи" - задержка в коде


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 передает строку далее парсеру...