![]() |
|
||||||||||
|
|||||
|
ветеран форума
|
Есть у меня необходимость проверки капчи:
проверяю я так 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;
}
}
тогда когда это значение еще не определено (не пришло с сервера), как правильно в данном случае выдержать паузу перед этим фрагментом кода или как вернуть значение функции isCaptchaCorrect(...) из fnOnLoad(...); или какие вообще алгоритмы используются в подобных проверках подскажите, пожалуйста.... З.Ы. В поиске рылся ничего подходящего для себя в данном случае с исп. setInterval или setTimeout не нашел (или не сообразил)
__________________
trace("Остановите Землю, я сойду!!!"); Последний раз редактировалось Mur4ik; 26.09.2008 в 04:40. |
|
|||||
|
.
|
Аниснхронность в данном случает подразумевает проверку isCaptchaCorrect после получения ответа от сервера. Никаких задержек вводить не надо =).
|
|
|||||
|
Регистрация: Feb 2007
Сообщений: 563
|
http://www.flasher.ru/forum/showthread.php?t=112398 посмотрите тут, возможно это вам поможет.
|
|
|||||
|
ветеран форума
|
спасибо, но это не к моему случаю...
неужели никто и никогда сталкивался с такой проблемой....? Можно и по-другому: Возможно ли вернуть значение родительской функции из дочерней, т.е если функции вложенные (хотя где то попадалось что вложенные функции это и не лучшая практика), то вернуть return для родительской функции из вложенной?
__________________
trace("Остановите Землю, я сойду!!!"); |
|
|||||
|
ветеран форума
|
Неужели у местных ГУРУ нет никаких мыслей по данному вопросу?
Ситуация вроде очень распространенная когда нужно определить пришел ли ответ от сервера или нет после запроса... Никто не подскажет в каком направлении копать для решения проблемы?
__________________
trace("Остановите Землю, я сойду!!!"); |
|
|||||
|
Flash Aксакал
Регистрация: Jun 2005
Сообщений: 636
|
менять структуру. Синхронно отослать и получить ответ в одном блоке кода нельзя. точнее не возможно во флэше
|
|
|||||
|
ветеран форума
|
это я уже понял, вот только не красиво и не читабельно получается что приходится делать кучу функций которые запускаются цепочкой и одна передает параметры другой, что б в конце концов дойти до того участка кода где мне нужно проверить значения полученные от сервера....
Просто думал есть какой то универсальное и наработанное кем то решение (совет) при организации общения с сервером и уж тем более с проверкой "Капчей". ) Если никто больше опытом поделится не хочет ,то вопрос можно считать закрытым... Всем спасибо.
__________________
trace("Остановите Землю, я сойду!!!"); |
|
|||||
|
Banned
[+5 15.02.09]
[++5 15.02.09] Регистрация: Mar 2008
Адрес: Krasnoyarsk
Сообщений: 587
|
Послал запрос... Ждеш ответа. Ответ прийдет всегда. Если 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:46. |
|
|
« Предыдущая тема | Следующая тема » |
|
|