2009-08-19 6 views
0

Les appels de service Web sont asynchrones dans flex, mais je voulais envelopper un appel de service Web dans une classe pour assurer l'encapsulation synchrone. Quelque chose comme ci-dessous - l'utilisateur peut appeler getMyMethodResult et obtenir le résultat renvoyé par le service Web. Je m'attendais à ce que le thread qui recevait la réponse de savon peuplerait la variable _result et signifiait que getMyMethod, après un certain temps, trouverait _result n'est plus null. Mais ce n'est pas le cas! Quelqu'un peut-il expliquer pourquoi cela ne fonctionne pas?Programmation des appels de service Web synchrones dans flex

public class myClass 
{ 
    private var _result:Object; 
    public function myClass() 
    { 
     //create a web service object 
     ... 

     // Add listener 
     _service.addMyMethodListener(myMethodListener); 
    } 

    public function getMyMethodResult() 
    { 
     _service.myMethod(); 

     while (_result == null) 
     { 
     // count a variable or something (unimportant) 
     } 

     return _result; 
    } 

    private function myMethodListener(event:Event):void 
    { 
     _result = event.result; 
    } 
} 

Répondre

1

Il n'y a absolument aucun support pour cela. La boucle d'événement est exécutée entre les images et tant que vous bloquez l'exécution avec votre boucle (infinie), votre fonction myMethodListener ne sera pas appelée. Quoi qu'il en soit, ce serait une mauvaise idée puisque l'absence de thread dans Flash Player provoquera le gel de votre interface utilisateur pendant que vous attendez le retour de votre service. Vous devriez juste laisser tomber cette idée.

+0

Merci pour votre réponse. Je ne comprends toujours pas; Je pensais qu'ils couraient dans des fils différents? Comment le lecteur flash gère-t-il le retour asynchrone si ce n'est pas par un thread différent? Si la boucle d'événements gère tout, pourriez-vous expliquer l'ordre d'exécution de ces tâches? Merci –

+0

BTW, je suis heureux de "laisser tomber l'idée", je me demandais juste pourquoi cela n'a pas fonctionné, donc je pourrais mieux comprendre la façon dont le lecteur flash/flex exploité. Je suis nouveau à flex! –

+1

Le lecteur flash n'interrompt pas l'exécution de votre code lorsqu'il reçoit un tel événement. Ça va attendre jusqu'à la prochaine image, si je ne me trompe pas. L'implémentation en arrière-plan du lecteur utilise probablement un thread pour cela, mais place les événements en file d'attente pour que l'actionScript soit exécuté sur un seul thread. – sharvey

Questions connexes