2012-04-12 18 views
1

Ich habe ein Problem mit mehreren Remote-Objektaufrufen. Also muss ich zuerst die Arbeitgeber-IDs vom Server abrufen (mit BlazeDS btw), zweitens muss ich für jede Arbeitgeber-ID eine Anfrage machen und andere Details für JEDEN Arbeitgeber (weitere 2 Remote-Objekt-Anrufe für jede Arbeitgeber-ID) nach dort Arbeitgeber-IDs abrufen. So wie Sie verstanden haben, wird der dritte entfernte Objektaufruf die Antwort des 2. als Parameter annehmen, und der zweite wird die Antwort des ersten als Parameter annehmen.Flex mehrere remote Objektaufruf

Mein Problem ist, dass, wenn ich durch die Antwort der ersten Anfrage iterieren es das zweite Remote-Objekt nur für sein letztes Element nicht für jedes ist.

Hier ist meine Ansicht Code:

<fx:Declarations> 
    <parsley:FastInject property="karBUS" type="{KarBUS}"/> 
     <s:CallResponder id="hastalariGetirResponder" result="hastalariGetirResponder_resultHandler(event)"/> 
     <s:CallResponder id="yatakOdaGetirResponder" result="yatakOdaGetirResponder_resultHandler(event)" fault="yatakOdaGetirResponder_faultHandler(event)"/> 
     <s:CallResponder id="hastaKartlariGetirResponder" result="hastaKartlariGetirResponder_resultHandler(event)"/> 
     <s:CallResponder id="hastaResimGetirResponder" result="hastaResimGetirResponder_resultHandler(event)"/> 
     <parsley:Configure /> 
    </fx:Declarations> 

<fx:Script> 
     <![CDATA[ 

[Inject(id="karBUS")] 
public var karBUS:KarBUS; 

      protected function view1_creationCompleteHandler(event:FlexEvent):void 
      { 


       trace("Hastalarim View: persID:"+SessionClientData.prsnl.personelId+",servisID: " + SessionClientData.servisId); 
       hastalariGetirResponder.token = karBUS.getHastalarim(SessionClientData.prsnl.personelId,SessionClientData.servisId); 

      } 

protected function hastalariGetirResponder_resultHandler(event:ResultEvent):void 
      { 
       hastalarim = hastalariGetirResponder.lastResult; 

       if(hastalarim.length == 0) { 
        this.addElement(txt_empty); 
        this.removeElement(busy_ind); 
       } 

       for(var i:int=0;i<hastalarim.length;i++){ 

        kt = hastalarim.getItemAt(i) as Object; 

        vizitID = kt[6]; 
        hastaTC = kt[3]; 

        yatakOdaGetirResponder.token = karBUS.getYatakOdaNo(vizitID); 
       } 

      } 


protected function yatakOdaGetirResponder_resultHandler(event:ResultEvent):void 
      { 
       yatakOda = yatakOdaGetirResponder.lastResult as Object; 

       hastaKartlariGetirResponder.token = karBUS.getHastaKarti(vizitID); 

      } 

      protected function hastaKartlariGetirResponder_resultHandler(event:ResultEvent):void 
      { 
       hastaTuru = hastaKartlariGetirResponder.lastResult as String; 

       hastaResimGetirResponder.token = karBUS.getHastaResim(hastaTC); 
      } 

      protected function hastaResimGetirResponder_resultHandler(event:ResultEvent):void 
      { 
       resim = hastaResimGetirResponder.lastResult as ByteArray; 


       dp=new ArrayCollection(); 

       var yatak:String; 
       var oda:String; 
       var kat:String; 

       if(yatakOda == null){ 
        yatak = ""; 
        oda = ""; 
        kat = ""; 
       }else{ 
        yatak = yatakOda[2]; 
        oda = yatakOda[1]; 
        kat = yatakOda[0]; 
       } 

       for(var i:int=0;i<hastalarim.length;i++){ 

        kt = hastalarim.getItemAt(i) as Object; 

        var dt:Date = kt[5] as Date; 
        var vizitT:String = dt.date + "-" + (dt.month+1) + "-" + dt.fullYear; 

        dp.addItem({hastaId:kt[0], adi:kt[1],soyadi:kt[2],tcKimlikNo:kt[3], resim: resim, 
         yasi:kt[4],katNo:kat,odaNo:oda,yatakNo:yatak, 
         vizitTarihi:vizitT,vizitId:kt[6],cinsiyeti:kt[7], hastaTuru:hastaTuru}); 


        trace("OdaNO - Yatak NO: "+ oda + ", " + yatak); 

       } 






      } 



    ]]> 
    </fx:Script> 

Wie kann ich flex Threads machen warten, bis die vorherige eine Antwort zurückgibt? irgendeine Thread-Handhabungsmethode?

Antwort

3

ich glaube, das Problem ist, dass Sie das Token jedes Mal überschreiben

for(var i:int=0;i<hastalarim.length;i++){ 
    ...  
    yatakOdaGetirResponder.token = karBUS2.getYatakOdaNo(vizitID); 
} 

so nur die Antwort auf die letzte Anfrage bearbeitet wird.

Sie sollten den statischen Responder yatakOdaGetirResponder nicht verwenden, sondern für jede Anforderung ein neues Objekt CallResponder erstellen.

for(var i:int=0;i<hastalarim.length;i++){ 
    ...  
    var responder: CallResponder = new CallResponder(); 
    responder.addEventListener(ResultEvent.RESULT, yatakOdaGetirResponder_resultHandler); 
    responder.token = karBUS2.getYatakOdaNo(vizitID); 
} 
+0

Ja, ich habe darüber nachgedacht ... Gibt es eine Möglichkeit, einen neuen Token für jeden Call-Responder zu erstellen ?! ODER muss ich jedes Mal vor der Iteration verschiedene Call Responder anlegen ?! –

+0

Ja, das würde ich tun, wenn es keine Alternativen gäbe. Jetzt werde ich alle statischen Anrufbeantworter in dynamische umwandeln. Aber das war ein gutes Detail, und danke platsch! –

+0

Eine weitere Frage, gibt es eine Methode zu wissen, dass alle 4 Remote-Objektaufrufe durchgeführt werden, um sie in eine Liste einzufügen ?! wie ich verstanden, funktioniert flex remote object call in "queue" mode - es setzt jeden neuen aufruf in eine warteschlange und ruft sie schließlich auf, wenn der result-handler, den ich ihnen geschrieben habe, fertig ist ... Gibt es mehr oberklasse um uns zu informieren wenn alle Anfragen erledigt sind oder so ?! –