Просмотр полной версии : проверка "Капчи" - задержка в коде
Есть у меня необходимость проверки капчи:
проверяю я так
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 не нашел (или не сообразил)
Аниснхронность в данном случает подразумевает проверку isCaptchaCorrect после получения ответа от сервера. Никаких задержек вводить не надо =).
Это понятно, а как определить что ответ уже получен вне функции fnOnLoad ?
AlexDesinger
26.09.2008, 13:49
http://www.flasher.ru/forum/showthread.php?t=112398 посмотрите тут, возможно это вам поможет.
спасибо, но это не к моему случаю...
неужели никто и никогда сталкивался с такой проблемой....?
Можно и по-другому:
Возможно ли вернуть значение родительской функции из дочерней,
т.е если функции вложенные (хотя где то попадалось что вложенные функции это и не лучшая практика), то вернуть return для родительской функции из вложенной?
Неужели у местных ГУРУ нет никаких мыслей по данному вопросу?
Ситуация вроде очень распространенная когда нужно определить пришел ли ответ от сервера или нет после запроса...
Никто не подскажет в каком направлении копать для решения проблемы?
менять структуру. Синхронно отослать и получить ответ в одном блоке кода нельзя. точнее не возможно во флэше
это я уже понял, вот только не красиво и не читабельно получается что приходится делать кучу функций которые запускаются цепочкой и одна передает параметры другой, что б в конце концов дойти до того участка кода где мне нужно проверить значения полученные от сервера....
Просто думал есть какой то универсальное и наработанное кем то решение (совет) при организации общения с сервером и уж тем более с проверкой "Капчей". )
Если никто больше опытом поделится не хочет :),
то вопрос можно считать закрытым...
Всем спасибо.
Послал запрос... Ждеш ответа. Ответ прийдет всегда. Если 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 передает строку далее парсеру...
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.