Comunidad de diseño web y desarrollo en internet online

Problema con Timerevent y BUCLE FOR

Citar            
MensajeEscrito el 08 Jun 2008 10:44 am
Hola!

Estoy trabajando con un script the PHP que recibe unas variables y devuelve otras, este proceso lleva algun tiempo de calculos. Para permitir al servidor hacer estas gestiones he colocado en mi película de flash un Timer que repite la operación de solicitud cada segundo.
El problema es que ese Timer esta dentro de un bucle FOR y parece que este no deja de contar aunque timer esté esperando:

Código :

for(k=0;k<theValuesToGive[k].length;k++){
interval.addEventListener(TimerEvent.TIMER, retry);
interval.start();
function retry(event:TimerEvent):void{
if(getData(theValuesToGive[k])){
   interval.stop();
   theValuesToGet[k]=url;
   trace("Los valores son "+k+" : "+urls[k]);
            }
         }
      }


Al trazar las variables lo que obtengo es lo siguiente:

Código :

The values are 6 : 554755
Los valores son  6 : 554755
Los valores son  6 : 554755
Los valores son  6 : 554755
Los valores son  6 : 554755
Los valores son  6 : 554755


A alguien se le ocurre donde puede estar el problema?

Por PrincesaLeya

39 de clabLevel



Genero:Femenino  

firefox
Citar            
MensajeEscrito el 08 Jun 2008 05:08 pm
:shock: noo no pongas un timer dentro de un bucle..
tenes que usar el URLrequest y el URLvariables para eso. sin usar timer ni nada,. mira aca te dejo el script qua antes utilizaba yo..

Código :

var PhpUrl:String = "file.php"; //archivo php donde esta el proseso
var PhpRequest:URLRequest = new URLRequest(PhpUrl);
var toPhpVars:URLVariables = new URLVariables();
//variables a enviar
toPhpVars.var1 = "hola mundijirisillo";
toPhpVars.var2 = "etc..";
PhpRequest.data = toPhpVars;
navigateToURL(PhpRequest);//aca encvias todo si queres lo pones dentro de una funcion
PhpListeners(PhpRequest);
//-eventos
function PhpListeners(dispatcher:IEventDispatcher):void {
   dispatcher.addEventListener(Event.COMPLETE, phpComplete);
   dispatcher.addEventListener(Event.OPEN, phpOpen);
   dispatcher.addEventListener(ProgressEvent.PROGRESS, phpProgress);
}
function phpOpen(event:Event):void {
   trace("openHandler: " + event);
}

function phpProgress(event:ProgressEvent):void {
   trace("progressHandler loaded:" + event.bytesLoaded + " total: " + event.bytesTotal);
}
//este evento te muestra cuando se hiso el proseso y devuelve el resultado..
function phpComplete(event:Event):void {
   var DataFromPhp:URLLoader = URLLoader(event.target);
   var varsFromPhp:URLVariables = new URLVariables(DataFromPhp.data);
   
   varsFromPhp.var1
}


una cosa muy importante es que en el php las variables que envias de regresos a AS3 se colocan asi..
echo "var1=voy de regreso al flash'";
echo "var2=".$otravariable;

saludos.
las tenes queimprimir. sino no andan..

Por phoxer

Claber

827 de clabLevel

4 tutoriales

Genero:Masculino  

Ing en Sistemas

firefox
Citar            
MensajeEscrito el 08 Jun 2008 05:33 pm
Muchas gracias phoxer!!!

Voy a probarlo ahora mismo !!!!

Por PrincesaLeya

39 de clabLevel



Genero:Femenino  

firefox
Citar            
MensajeEscrito el 08 Jun 2008 09:19 pm
Gracias de nuevo Phoxer por tu explicación, pero me acabo de dar cuenta de que no me he explicado bien...
Ya tengo una función que envía y recoge las variables y dicha función tiene un listener para el evento complete:

function getData(value){
var variables:URLVariables = new URLVariables();
variables.password = '';
variables.usuario = '';
variables.value='';
var tomadatos:URLRequest = new URLRequest( "http://www.midominio/datos.php" );
tomadatos.method = URLRequestMethod.POST;
tomadatos.data = variables;
var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.TEXT;
loader.addEventListener( Event.COMPLETE, loadCompleteHandler );
loader.load( tomadatos );
function loadCompleteHandler( event:Event ):void{
losdatos = event.target.data as String;
}
return losdatos;
}

Esta funcion no tiene problemas y si la aplico me devuelve el resultado esperado, aunque necesita tiempo para obtener la respuesta del servidor. El problema esta en que necesito meterla en un bucle para que me devuelva varios valores, y al meterla en el bucle tengo dos problemas:
Si le pongo el Timer ocurre lo que ya postee.
Si no se lo pongo los resultados simplemente aparecen vacios:
Los valores son 0 :

Los valores son 1 :

Los valores son 2 :

Los valores son 3 :

Los valores son 4 :

Por PrincesaLeya

39 de clabLevel



Genero:Femenino  

firefox
Citar            
MensajeEscrito el 09 Jun 2008 12:15 am
mmm vos lo que queres haces es llamar varias veses al php para obtener varios resultados diferentes? o de una te trae los valores diferentes?.

Por phoxer

Claber

827 de clabLevel

4 tutoriales

Genero:Masculino  

Ing en Sistemas

firefox
Citar            
MensajeEscrito el 09 Jun 2008 08:56 am
Tengo que llamarlo varias veces necesariamente, cada vez le envío un string y el hace unos cálculos y me devuelve una variable. En este caso lo que tengo es un array con varios strings y por eso creo un bucle FOR.

Por PrincesaLeya

39 de clabLevel



Genero:Femenino  

msie7
Citar            
MensajeEscrito el 09 Jun 2008 02:14 pm
¡No me abandones PHOXER!

Por PrincesaLeya

39 de clabLevel



Genero:Femenino  

msie7
Citar            
MensajeEscrito el 09 Jun 2008 02:20 pm
jajaj nooo no te abandono jajaj
pero toy teniendo ese tipico lunes que tenes la casilla llena de cambios y nuevos proyectos :cry:
y un jefe madrugador!!! :cry: :cry: :cry:

todabia no entiendo que es lo que recivis vos del php..
contame un poco mas. que es lo que mandas por ejemplo y como lo recivis.
porque hay diferencia si recivis un Array de resultados a que si vas y buscas un resultado a la vez.

por otra parte tene en cuenta que un TimeEvent es ya un bucle.

Por phoxer

Claber

827 de clabLevel

4 tutoriales

Genero:Masculino  

Ing en Sistemas

msie7
Citar            
MensajeEscrito el 09 Jun 2008 02:44 pm
Siempre recibo un solo resultado, digamos que envio un string y el servidor me devuelve un cálculo de ese string que es igual a una variable. Ahora tengo varios strings en un array y quiero enviarlos todos y que el servidor me devuelva otro array con los resultados, pero el servidor no puede enviarme ese array, el servidor va a tomar cada uno de los Strings que le envío y me va a devolver uno por uno todos. por eso tengo que esperar quiza a recibir el primero para pedir el siguiente: y ese es el problema.
:(

Por PrincesaLeya

39 de clabLevel



Genero:Femenino  

msie7
Citar            
MensajeEscrito el 09 Jun 2008 03:36 pm
:o hay un bug en los fotos que a veses te borra el post .. :crap:

Lo que te decia que quizas nesesites una funcion recursiva..
que se llame a si misma tantas veses tengas que buscar un resultado..

Código :

var valores:Array= new Array("valor1","valor2","valor3");
var totalValores:int=valores.length;
var valorActual:int=0;

var PhpUrl:String = "tuArchivo.php"; 
var SendAndLoad:URLLoader= new URLLoader();
var PhpRequest:URLRequest = new URLRequest(PhpUrl);
PhpRequest.method = URLRequestMethod.POST;
var toPhpVars:URLVariables = new URLVariables();

//variables a enviar (recursivamente)
function tomarValores():void {
   if (valorActual<totalValores) {
      toPhpVars.valor = valores[valorActual];
      PhpRequest.data = toPhpVars;
      SendAndLoad.load(PhpRequest);
      PhpListeners(SendAndLoad);
      valorActual++;
   }
}

//-eventos
function PhpListeners(dispatcher:IEventDispatcher):void {
    dispatcher.addEventListener(Event.COMPLETE, phpComplete);
}
//este evento te muestra cuando se hiso el proseso y devuelve el resultado..
function phpComplete(event:Event):void {
   var DataFromPhp:URLLoader = URLLoader(event.target);
   var varsFromPhp:URLVariables = new URLVariables(DataFromPhp.data);
   tomarValores();//aqui se llama nuevamente
   trace(varsFromPhp.valor);//este es el resultado que devuelve
}
//
tomarValores();


esta funcion "tomarValores()" se va a llamar tantas veses recupere un valor.. cuando el proseso recupero un valor. manda el otro y asi etc.etc... ^^

Por phoxer

Claber

827 de clabLevel

4 tutoriales

Genero:Masculino  

Ing en Sistemas

msie7
Citar            
MensajeEscrito el 09 Jun 2008 04:28 pm
Voy a probar ahora mismo, MUCHAS CRACIAS PHOXER !!!

Por PrincesaLeya

39 de clabLevel



Genero:Femenino  

msie7
Citar            
MensajeEscrito el 09 Jun 2008 05:27 pm
Ahora parece que nos acercamos, aunque me da el siguiente error:

Error: Error #2101: La cadena transmitida a URLVariables.decode() debe ser una cadena de consulta con formato URL codificado y pares nombre/valor.


Pero lo cierto es que he hecho un trace de las variables y estan bien ordenados y aparentemente codificadas para URL el unico problema es que estoy pasando como Strings cadenas de texto en castellano, con acentos, signos de puntuacion, etc...
¿Debeberia aplicarle algún tipo de encode?

Por PrincesaLeya

39 de clabLevel



Genero:Femenino  

msie7
Citar            
MensajeEscrito el 09 Jun 2008 05:41 pm
mmm lo que te esta poniendo ahi es porque estas llamando a un archivo remotamente. y te pide que coloques la ruta absoluta. tipo http://eldominio.com/tuphp.php en

Código :

var PhpUrl:String = "http://eldominio.com/tuArchivo.php";

generalmente por eso tira ese error..

Por phoxer

Claber

827 de clabLevel

4 tutoriales

Genero:Masculino  

Ing en Sistemas

msie7
Citar            
MensajeEscrito el 09 Jun 2008 05:46 pm
ya se lo que ocurre realmente, los valores que devuelve PHP no los devuelve en forma de variables, en realidad es una aplicación muy básica que se limita a hacer un echo de la variable:

NO ESCRIBE:
var=989898

LO QUE ESCRIBE ES SIMPLEMENTE:
989898

Por PrincesaLeya

39 de clabLevel



Genero:Femenino  

msie7
Citar            
MensajeEscrito el 09 Jun 2008 06:48 pm
Ok, ya funciona todo perfectamente.
Solo tenia que decirle el tipo de dato de la variable:


SendAndLoad.dataFormat = URLLoaderDataFormat.TEXT;


GRACIAS POR TU AYUDA PHOXER!!!

Por PrincesaLeya

39 de clabLevel



Genero:Femenino  

msie7
Citar            
MensajeEscrito el 09 Jun 2008 06:56 pm
de naaaa ^^

Por phoxer

Claber

827 de clabLevel

4 tutoriales

Genero:Masculino  

Ing en Sistemas

msie7
Citar            
MensajeEscrito el 11 Jun 2008 08:17 pm
PHOXER perdoname por ser tu pesadilla !!
Estoy intentando meter todo lo anterior en una clase pero siempre me da error.
La verdad es que las clases me superan...
Si quieres que te diga la verdad lo unico que he hecho es meter el codigo de antes en un paquete y en una clase:
[ CODE]
package classes {
public class dameDatos {
function dameDatos() {}
var valores:Array= new Array("valor1","valor2","valor3");
var totalValores:int=valores.length;
var valorActual:int=0;
var PhpUrl:String = "tuArchivo.php";
var SendAndLoad:URLLoader= new URLLoader();
var PhpRequest:URLRequest = new URLRequest(PhpUrl);
PhpRequest.method = URLRequestMethod.POST;
var toPhpVars:URLVariables = new URLVariables();
function tomarValores():void {
if (valorActual<totalValores) {
toPhpVars.valor = valores[valorActual];
PhpRequest.data = toPhpVars;
SendAndLoad.load(PhpRequest);
PhpListeners(SendAndLoad);
valorActual++; }
}
PhpListeners(dispatcher:IEventDispatcher):void {
dispatcher.addEventListener(Event.COMPLETE, phpComplete);
}
function phpComplete(event:Event):void {
var DataFromPhp:URLLoader = URLLoader(event.target);
var varsFromPhp:URLVariables = new URLVariables(DataFromPhp.data);
tomarValores();
trace(varsFromPhp.valor);
}
}
}
[/CODE ]
Siempre me da errores 1046, concretamente en los eventos:
PhpListeners(dispatcher:IEventDispatcher):void {
function phpComplete(event:Event):void {

Por PrincesaLeya

39 de clabLevel



Genero:Femenino  

msie7
Citar            
MensajeEscrito el 11 Jun 2008 10:06 pm
^^ no hay drama. Mira basicamente una clase se podría explicar como una agrupación de funciones para un objetivo en especial. te explico asi luego puedes aplicarlo en cualquier objetivo que desees.
es medio complejo el tema como para verlo asi nomas. y ojala tuviera mas tiempo como para explicarte mas precisamente como es que lo veo y entiendo yo verdad?. ya que por ahi hay mejores técnicas pero por lo menos las mias me dan resultado a mi. :)

primero las clases tienen que estar siempre en una carpeta. yo por ejemplo uso una carpeta llamada "clases" dentro tengo varias carpetas separando las clases por su funcionalidad.
en este caso puedes poner la clase dentro de una carpeta llamada "dataManager" cuando referencies el flash la ruta de las clases siempre va a ser "path:/clases" asi siempre en todos los proyectos vas a tener las clases disponibles.
si vos armas clases especificas por proyectos es una practica por default que la carpeta de esas clases sea "com" y dentro el nombre de la pagina. ejemplo "clab"

la estructura seria entonses :

clases -- > dataManager
clases --> com --> clab

mas o menos se entiende?.. bueno.. hay mucho igualmente por ahi sobre este tema igualmente y mejor explicado :P

dame algo de tiempo que si queres te armo algo. primero tengo que terminar una cosa sino me hacen calzon chino!! si? :crap:

pero por lo menos anda armando la estructura de clases y otra cosa. nunca van los valores de variables dentro de las clases. generalmente estas estan para que sean estandares y funcionen con varios proyectos. :wink:

Por phoxer

Claber

827 de clabLevel

4 tutoriales

Genero:Masculino  

Ing en Sistemas

firefox
Citar            
MensajeEscrito el 11 Jun 2008 10:17 pm
Por ahora tengo todas las clases en una carpeta que se llama "classes", espero tus noticias.



:D

Por PrincesaLeya

39 de clabLevel



Genero:Femenino  

firefox
Citar            
MensajeEscrito el 12 Jun 2008 12:27 pm
hola como estas.. bueno encontré un tiempito como para armarte una clase simple de sendandload.
:) te aclaro que esta clase sirve solo para enviar una variable a la vez. yo tengo una que es para mandar objetos pero es mas perzonalizada y solo yola entiendo :roll: jaja. viste que cada programador tiene su rollo.. ^^

bueno aca esta..

Código :

package phoxer{
   import flash.net.URLLoader;
   import flash.net.URLRequest;
   import flash.net.URLVariables;
   import flash.events.IEventDispatcher;
   import flash.events.Event;
   import flash.net.URLRequestMethod;
   public class SendAndLoadData{
      private var SendAndLoad:URLLoader;
      private var PhpRequest:URLRequest;
      private var toPhpVars:URLVariables;
      private var onComplete:Function;
      private var DataFromPhp:URLLoader;
      private var varsFromPhp:URLVariables;
      public function SendAndLoadData(complete:Function):void{
         onComplete=complete;
      }
      //variables a enviar (recursivamente)
      public function sendData(vars:String,valor:String,php:String):void {
         SendAndLoad = new URLLoader();
         PhpRequest = new URLRequest(php);
         PhpRequest.method = URLRequestMethod.POST;
         toPhpVars= new URLVariables();
          toPhpVars[vars] = valor;
          PhpRequest.data = toPhpVars;
          SendAndLoad.load(PhpRequest);
          PhpListeners(SendAndLoad);
      }
      //-eventos
      private function PhpListeners(dispatcher:IEventDispatcher):void {
          dispatcher.addEventListener(Event.COMPLETE, phpComplete);
      }
      //este evento te muestra cuando se hiso el proseso y devuelve el resultado..
      private function phpComplete(event:Event):void {
         DataFromPhp = URLLoader(event.target);
         varsFromPhp = new URLVariables(DataFromPhp.data);
         onComplete(varsFromPhp);
      }
   }
}


bueno en el flash tenes que instanciar la clase.
ejemplo:

Código :

import phoxer.SendAndLoadData;

var snd:SendAndLoadData= new SendAndLoadData(onComplete);
function onComplete(valores:Object):void{
   trace(valores);
};
snd.sendData("string","phoxer","md5.php");


para probarlo hice un php:

Código :

<?php
$valor= $_POST['string'];
echo "md5=".md5($valor);
?>


y el resultado fue:

Código :

md5=b450a8a6199f2686bcf082c55008f445


bueno. basicamente la clase sirve para enviar y recivir datos a un php
vos adaptale la cosa de que te envie y devuelva los valores que presisas ^^

espero que te sirva.. saludos..

Por phoxer

Claber

827 de clabLevel

4 tutoriales

Genero:Masculino  

Ing en Sistemas

firefox
Citar            
MensajeEscrito el 12 Jun 2008 07:00 pm
Hola Phoxer !

Acabo de ver tu respuesta, hoy he pasado el dia fuera.
Voy a probarlo todo !!

:D

Por PrincesaLeya

39 de clabLevel



Genero:Femenino  

msie7
Citar            
MensajeEscrito el 13 Jun 2008 12:23 pm
Hola de nuevo Phoxer !

Solo tengo un problema, el PHP de mi servidor no arroja:

Código :

echo "md5=".md5($valor);

Arroja simplemente:

Código :

echo md5($valor);


para arreglar este problema he seguido los siguientes pasos:

En el package importe:

Código :

import flash.net.URLLoaderDataFormat;

Despues en la funcion sendData añadi:

Código :

SendAndLoad.dataFormat = URLLoaderDataFormat.TEXT;

Finalmente en la función phpComplete:

Código :

private function phpComplete(event:Event):void {
       DataFromPhp = URLLoader(event.target.data as String);
       varsFromPhp = new URLVariables(DataFromPhp.data);
         onComplete(varsFromPhp);
      }

Pero al instanciar me sigue dando un Error #1034 de conversion forzada.
Aunque en el mensaje de error me escribe la variable del PHP luego el intercamvio de informacion funciona...

Por PrincesaLeya

39 de clabLevel



Genero:Femenino  

firefox
Citar            
MensajeEscrito el 13 Jun 2008 12:34 pm
Ya lo arregle Phoxer !!
Sólo he convertido la variable DataFromPhp a String y he borrado la penultima línea de la función phpComplete.
Resuelto !

Por PrincesaLeya

39 de clabLevel



Genero:Femenino  

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.