flex - sincrono - promesas javascript ajax
AS3-¿Cómo hacer una carga síncrona de una llamada asíncrona? (4)
Tengo una función que carga un objeto de usuario de un servicio web de forma asincrónica.
Envuelvo esta llamada de función en otra función y la hago sincrónica.
Por ejemplo:
private function getUser():User{
var newUser:User;
var f:UserFactory = new UserFactory();
f.GetCurrent(function(u:User):void{
newUser = u;
});
return newUser;
}
UserFactory.GetCurrent se ve así:
public function GetCurrent(callback:Function):void{ }
Pero tengo entendido que no hay garantía de que cuando se llame a esta función, ¿newUser realmente será el nuevo usuario?
¿Cómo se logra este tipo de función de retorno en Flex?
De esta manera, la locura miente.
En serio, es mejor que no intentes forzar una llamada asincrónica a algún tipo de arquitectura síncrona. Descubra cómo funciona el sistema de manejo de eventos a su favor y agregue un controlador para el evento resultante. De hecho, aquí está el consejo directamente de las FAQ de flexcoders :
Q: How do I make synchronous data calls? A: You CANNOT do synchronous calls. You MUST use the result event. No, you can''t use a loop, or setInterval or even callLater. This paradigm is quite aggravating at first. Take a deep breath, surrender to the inevitable, resistance is futile. There is a generic way to handle the asynchronous nature of data service calls called ACT (Asynchronous Call Token). Search for this in Developing Flex Apps doc for a full description.
El puerto AS3 del marco PureMVC tiene mecanismos para implementar operaciones síncronas en un contexto Model-View-Controller. No intenta sincronizar llamadas asincrónicas, pero le permite agregar un patrón de aplicación síncrona para controlarlas.
Aquí hay una implementación de ejemplo: PureMVC AS3 Sequential Demo .
En este ejemplo, cinco subcomandos se ejecutan de forma secuencial, formando juntos un comando completo. En su ejemplo, implementaría getUser()
como un comando, que llamaría a commandComplete()
en la devolución de llamada getURL()
(o lo que sea). Esto significa que el siguiente comando es seguro de que la operación getUser()
ha finalizado.
No se puede convertir la llamada asincrónica en sincronización uno sin algo así como la función "sleep ()" y, por lo que yo sé, falta en AS3. Y sí, no se garantiza que newUser contenga el nombre de usuario antes de la declaración de devolución.
Vea mi respuesta aquí:
DDD y repositorios asincrónicos
Flex y Flash Remoting son inherentemente asincrónicos, por lo que luchar contra ese paradigma te dará un montón de problemas. Nuestros delegados de servicio devuelven AsyncToken de cada método y nunca hemos tenido un problema con él.
Si desea asegurarse de que la aplicación no muestre una nueva vista o realice alguna otra lógica hasta que el resultado / falla regrese, podría hacer lo siguiente:
- Adjunte un detector de eventos para un evento personalizado que invocará su "código de resultado / falla posterior"
- Hacer la llamada asincrónica
- Manejar el resultado / falla
- Envíe el evento personalizado para activar su oyente desde # 1
Tenga en cuenta que esto conducirá a una gran cantidad de código molesto de la placa de calibración cada vez que realiza una llamada asíncrona. Consideraría con mucho cuidado si realmente necesita una ruta de ejecución sincrónica.