Gibt es eine Möglichkeit, synchrone Aufrufe mit RemoteObject in Flex zu machen?
Ein AsyncResponder wird für asynchrone Anrufantworten verwendet - er kann dies nicht auf synchrone Weise tun :(
Gibt es eine Möglichkeit, synchrone Aufrufe mit RemoteObject in Flex zu machen?
Alle E/A in Flex sind asynchron. Das typische Muster, um damit umzugehen, ist die Verwendung einer AsyncResponder
. Zum Beispiel:
var t:AsyncToken = remoteObject.methodCall();
t.addResponder(new AsyncResponder(resultEvent, faultEvent));
Ein AsyncResponder wird für asynchrone Anrufantworten verwendet - er kann dies nicht auf synchrone Weise tun :(
Und @Sandy Wenn ich ein Modell (auf der Flex-Seite) in einer bearbeitbaren DataGrid-Zelle gerendert habe und ich die Eingabe (nach einem bestimmten Format) validieren möchte, dann senden Sie das an den Server und validieren Sie (sagen wir, Eindeutigkeit). Wie kann ich dann den ersten Validator in einer verketteten Weise ungültig machen? Meine aktuelle Implementierung verwendet itemEditEnd eines DataGrid, um die Eingabe in einer Zelle zu validieren, und ruft danach den Server über ein RemoteObject auf. Je nachdem, was ich zurückbekomme, muss ich die Zelle, die gerade bearbeitet wurde, ungültig machen. Irgendwelche Ideen? Vielen Dank!
Denken Sie zweimal nach, wenn Sie es synchron haben wollen.
Wissen Sie, was synchron bedeutet? Es wird Ihre Anwendung einfrieren, bis sie Daten empfangen hat. Es sei denn, u sind ziemlich sicher, dass Ihre Remote-Aufruf Rückgabewert sofort (super schnelle Netzwerkverbindung) erhalten kann.
Wenn Ihre Funktionsaufrufe voneinander abhängen, würde ich vorschlagen, dass Sie einen Zustandsautomaten implementieren. z.B.
nach dem 1. asynchronen Aufruf wird Ihr Zustand zu STATE_1, und Ihr nächster Funktionsaufruf prüft diese Zustandsvariable, um über den nächsten Schritt zu entscheiden (ignorieren Sie den aktuellen Aufruf oder machen Sie weiter).
meine 2 Cents.
Wenn Sie synchrones Verhalten wünschen, fügen Sie einfach eine Wartezeit nach dem Aufruf hinzu.
EDIT: Ich habe Code für die Verkettung Verhalten, das ich sprach hinzugefügt. Ersetzen Sie einfach die Ergebnis-Handler jedes nachfolgende Mal, wenn Sie das remoteObject aufrufen.
...
remoteObject.function1(...);
...
private var resultHandler1(event:ResultEvent):void
{
...
remoteObject.removeEventListener(resultHandler1);
remoteObject.addEventListener(ResultEvent.RESULT, resultHandler2);
remoteObject.function2(...);
}
private var resultHandler2(event:ResultEvent):void
{
...
}
Verdammt! Sie können nicht in der Flex warten, und zweitens wissen Sie nicht, wann der Anruf abgeschlossen sein wird.
Nun, ich meinte warten im Sinne von nichts tun. Und natürlich kennen Sie den Zeitpunkt nicht, deshalb ist der Aufruf asynchron. Aber Sie können das remoteObject einfach erneut aus dem resultHandler eines Aufrufs aufrufen und sie auf diese Weise verketten.
Dies scheint der richtige Ansatz zu sein, wenn das eine vom anderen abhängt, einfach die eingebaute Ereignishierarchie verwenden, um Dinge rechtzeitig zu delegieren. Da der zweite Aufruf von Remote-Objekten nach Abschluss des ersten erfolgt, wissen wir, dass der zweite Aufruf auf dem ersten basiert und genau ist.
Ich habe dasselbe auf zwei Arten erreicht: Erstens, wie oben erwähnt, die Verwendung von Zustandsautomaten. Das kann manchmal knifflig werden. Zweitens, die Verwendung von Befehlswarteschlangen - ich denke, das ist der beste Weg, es zu tun... aber der Nachteil ist, dass die UI möglicherweise nicht sehr reflektierend in dieser Zeit sein.
Kann die Benutzeroberfläche benutzerfreundlicher gestalten, indem eine Ladeanzeige und informative Statusmeldungen angezeigt werden. Mit Flex ist dies ganz einfach - binden Sie einfach etwas in Ihrer Ladekomponente an den Wert einer loadingText:String-Eigenschaft in Ihrem Modell oder Präsentationsmodell, und aktualisieren Sie den loadingText-Wert von Ihrem Controller aus, während er die aufeinanderfolgenden Befehle oder Serviceaufrufe in Ihrer Warteschlange ausführt. Und schwupps!
Nein, warum sollten Sie das überhaupt tun wollen. Flex macht Dinge asynchron, so dass der Benutzer nicht gezwungen ist, zu warten, während die Daten zurückkommen. Es wäre ein sehr schlechtes Benutzererlebnis, wenn der Benutzer jedes Mal, wenn eine Anwendung Daten anfordert, darauf warten müsste, dass diese zurückkommen, bevor irgendetwas anderes passieren kann.
von Kommentar
Nein, Sie brauchen keinen Synchronus behaivour. Wenn Sie sagen, 2 Anrufe und Aufruf 2 kommt vor Aufruf 1, aber 2 stützt sich auf die Daten in 1 dann sind Sie mit entweder nicht abfeuern Ereignis 2, bis 1 zurückkommt (dies wird Ihre App verlangsamen - ähnlich wie Synchronus-Ereignisse) oder implementieren eine Möglichkeit zu überprüfen, dass Ereignis 1 zurück in Ereignis 2's Handler gekommen ist (es gibt viele Möglichkeiten, die Sie dies tun könnten). Wenn Sie viele Ereignisse abfeuern, warum haben Sie dann nicht eine Wrapper-Klasse, die Ihre Ereignisse verfolgt und nichts mit den Antworten macht, bis alle Ereignisse zurück sind. Sie können die AsyncToken verwenden, um den Überblick über die einzelnen Anforderungen zu halten, so dass, wenn Sie das Abfeuern von Lasten auf einmal sind, dann können Sie herausfinden, exaclty was zurück und was nicht kommen.
Huh - wenn Sie mehrere Remote-Objektaufrufe tätigen müssen, bei denen das Ergebnis eines Aufrufs von einem anderen abhängt, brauchen Sie synchrones Verhalten. Das Hinzufügen einer Fassade ist nicht immer möglich - insbesondere, wenn der Servercode nicht in Ihren Händen liegt.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.