2009-08-19 6 views
0

Web-Service-Aufrufe sind asynchron im Flex, aber ich wollte einen Web-Service-Aufruf in einer Klasse umschließen, um synchrone Kapselung bereitzustellen. So etwas wie das Folgende: Der Benutzer kann getMyMethodResult aufrufen und das Ergebnis vom Webdienst abrufen. Ich erwartete, dass der Thread, der die Soap-Antwort erhalten hatte, die Variable _result bevölkern würde und dass getMyMethod nach einiger Zeit feststellen würde, dass _result nicht länger null ist. Aber das tut es nicht! Kann mir jemand erklären, warum das nicht funktioniert?Programmierung von synchronen Web-Service-Aufrufen in 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; 
    } 
} 

Antwort

1

Es gibt absolut keine Unterstützung dafür. Die Ereignisschleife wird zwischen Frames ausgeführt, und solange Sie die Ausführung mit Ihrer (unendlichen) Schleife blockieren, wird Ihre myMethodListener-Funktion nicht aufgerufen. Wie dem auch sei, dies wäre eine schreckliche Idee, da das Fehlen von Threads im Flash Player dazu führt, dass Ihre Benutzeroberfläche nicht mehr reagiert, während Sie auf die Rückkehr Ihres Dienstes warten. Sie sollten diese Idee einfach fallen lassen.

+0

Danke für Ihre Antwort. Ich verstehe immer noch nicht; Ich dachte, sie würden in verschiedenen Threads laufen? Wie behandelt der Flash-Player die asynchrone Rückgabe, wenn nicht von einem anderen Thread? Wenn die Ereignisschleife alles verarbeitet, können Sie die Ausführungsreihenfolge dieser Aufgaben erklären? Danke –

+0

BTW, ich bin glücklich, "die Idee" fallen zu lassen, ich habe mich nur gewundert, warum es nicht funktioniert hat, damit ich besser verstehen konnte, wie der Flash Player/Flex funktioniert. Ich bin neu im Flex! –

+1

Der Flash-Player wird Ihre Codeausführung nicht unterbrechen, wenn er ein solches Ereignis empfängt. Es wird bis zum nächsten Frame warten, wenn ich mich nicht irre. Die Hintergrundimplementierung des Players verwendet wahrscheinlich einen Thread, um dies zu tun, stellt jedoch die Ereignisse in eine Warteschlange, so dass das ActionScript nur für einen Thread ausgeführt wird. – sharvey